2016-06-16 3 views
1

Есть ли чистый способ обнаружить, когда приложение весенней загрузки остановлено и выполнить какое-либо действие раньше? Вид CommandLineRunner для остановки службыСобытие остановки приложения для приложения Spring-boot

Заранее спасибо

+0

Вы можете посмотреть, например, http://docs.spring.io/spring/docs/4.1.6.RELEASE/spring-framework-reference/html/beans.html#beans-java. Там вы можете вызвать registerShutdownHook() в AbstractApplicationContext в не-веб-приложениях. –

ответ

1

Это зависит от того, что вы хотите сделать, но одна вещь, которую вы могли бы сделать, это есть компонент, который реализует SmartLifecycle и реализовать метод stop. Всякий раз, когда контекст останавливается, вы получаете обратный вызов. Обратите внимание, что это не обязательно означает, что процесс завершается. Если вы хотите вызвать какой-то код, когда это произойдет, я зарегистрирую крюк остановки, как писал Свен в комментарии.

1

Я придумал это решение. Если у вас есть лучшие, не стесняйтесь делиться ими.

@Component 
public class PortalServiceLifeCycle implements CommandLineRunner { 

static final Logger LOGGER = LoggerFactory.getLogger(PortalServiceLifeCycle.class); 

@Override 
public void run(String... arg0) throws Exception { 
    LOGGER.info("###START FROM THE LIFECYCLE###"); 
} 

@PreDestroy 
public void onExit() { 
    LOGGER.info("###STOP FROM THE LIFECYCLE###"); 
} 
} 
0

Не знаю, решите ли вы эту проблему. Недавно я встречаю эту проблему и имею решение, которое немного отличается.

Во-первых, мое приложение загрузки Spring - это встроенный Tomcat. (Второй метод этой проблемы не зависит от веб-структуры. Не сумасшедший, мой друг.) В этом случае, естественно, получить идею поймать событие остановки, зарегистрировав прослушиватель. Я делаю это так,

@WebListener 
public class HelloListener implements ServletContextListener { 

    @Override 
    public void contextInitialized(ServletContextEvent servletContextEvent) { 
     System.out.println("HelloListener contextInitialized"); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent servletContextEvent) { 
     System.out.println("HelloListener contextDestroyed"); 
    } 
} 

и, в то же время, добавить аннотацию @ServletComponentScan на классе приложений.

Конечно, есть еще несколько способов зарегистрировать ServletContextListener, и как только вы зарегистрировали его, вы можете получить событие остановки в функции contextDestroyed.

НО, это не соответствует моей проблеме. Я должен поймать событие остановки до того, как будут уничтожены весенние бобы. И вот второе решение.

изменить прикладную основной метод, как следующие:

SpringApplication application = new SpringApplication(DemoApplication.class); 
    application.addListeners(new MyListener()); 
    application.run(args); 

и обеспечить Defination класса MyListener:

class MyListener implements ApplicationListener<ContextClosedEvent>{ 

    @Override 
    public void onApplicationEvent(ContextClosedEvent contextClosedEvent) { 
     // your code here 
    } 
} 

Примечание: второе решение не имеет ничего общего с Tomcat или другой веб-контейнере , ContextClosedEvent не представлен в документе Spring, но я нашел его в источнике, это очень полезно, я думаю.

Я буду очень рад, если это поможет кому-то.

Смежные вопросы