是否有一種乾淨的方式來檢測彈簧引導應用程序何時停止並執行某些操作? CommandLineRunner的種類爲提前Spring引導應用程序的捕獲應用程序停止事件
1
A
回答
1
停止服務
感謝這取決於你想要做什麼,但有一兩件事你可以做的是有一個實現SmartLifecycle
一個bean並實現stop
方法。每當上下文停止時,您都會得到回調。請注意,這並不一定意味着該過程正在關閉。如果你想在發生這種情況時調用一些代碼,我會註冊一個關閉鉤子,正如Sven在評論中所寫的那樣。
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。 (這個問題的第二種方法不依賴於web結構,不要生氣,我的朋友)在這種情況下,通過註冊一個監聽器來捕獲停止事件是很自然的。我這樣做,
@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);
,並提供一流的myListener的概念的探討:
class MyListener implements ApplicationListener<ContextClosedEvent>{
@Override
public void onApplicationEvent(ContextClosedEvent contextClosedEvent) {
// your code here
}
}
注:第二方案無關,與Tomcat或其他web容器。 ContextClosedEvent沒有在Spring文檔中引入,但我在源代碼中找到它,這是非常有用的,我認爲。
如果這能幫助某人,我將非常高興。
相關問題
- 1. ASP.NET應用程序停止事件?
- 2. Windows Mobile - 捕獲應用程序/進程終止事件
- 3. 如何停止Spring Integration應用程序?
- 4. ObservableArray導致應用程序停止
- 5. Spring引導應用程序 - Tomcat部署
- 6. Spring引導REST應用程序
- 7. Spring引導應用程序和MessageSource
- 8. 捕獲另一個應用程序事件的Android應用程序
- 9. 應用程序停止unexpectdly
- 10. android:OnEditorActionListener停止應用程序
- 11. RSS應用程序停止
- 12. 停止Android應用程序
- 13. 應用程序已停止
- 14. 應用程序已停止
- 15. 應用程序停止
- 16. AsyncTask停止應用程序
- 17. 主應用程序停止響應UIViewController結束後的事件
- 18. 在應用程序外部捕獲應用程序「就緒」事件
- 19. 獲取應用程序停止錯誤
- 20. 不幸停止應用程序停止
- 21. 應用程序'停用'事件
- 22. Spring Security - 防止AccessDeniedException從停止應用程序正常流程
- 23. docker中的spring引導應用程序立即終止
- 24. 捕捉應用程序崩潰事件
- 25. 我的應用程序停止響應
- 26. Android應用程序,不幸的應用程序已停止
- 27. iPad應用程序停止響應接口事件正確
- 28. 當應用程序調用SQLiteOpenHelper時,Android應用程序停止
- 29. WinPhone應用程序事件對應用程序進程終止作出反應
- 30. 引導程序應用程序回滾
你可以看看例如http://docs.spring.io/spring/docs/4.1.6.RELEASE/spring-framework-reference/html/beans.html#beans-java。您可以在非Web應用程序的AbstractApplicationContext上調用registerShutdownHook()。 –