2016-06-16 68 views
1

是否有一種乾淨的方式來檢測彈簧引導應用程序何時停止並執行某些操作? CommandLineRunner的種類爲提前Spring引導應用程序的捕獲應用程序停止事件

+0

你可以看看例如http://docs.spring.io/spring/docs/4.1.6.RELEASE/spring-framework-reference/html/beans.html#beans-java。您可以在非Web應用程序的AbstractApplicationContext上調用registerShutdownHook()。 –

回答

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文檔中引入,但我在源代碼中找到它,這是非常有用的,我認爲。

如果這能幫助某人,我將非常高興。