2016-06-16 10 views
1

Spring-bootアプリケーションが停止したときを検出し、以前に何らかのアクションを実行するためのきれいな方法はありますか? CommandLineRunnerの種類は、サービスに事前Spring-bootアプリケーションのアプリケーション停止イベントをキャッチ

+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が組み込まれています。 (この問題の2番目の方法は、ウェブの構造に依存しません。私の友人ではありません。)この場合、リスナーを登録してストップイベントをキャッチすることは当然考えられます。私は

@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"); 
    } 
} 

、このようにそれを行うと、同時に、あなたのApplicationクラスに注釈を@ServletComponentScan追加します。

ServletContextListenerを登録するいくつかの方法があります。登録した後は、contextDestroyed関数でstopイベントを取得できます。

しかし、それは私の問題と非常に一致しません。私は春の豆が破壊される前にストップイベントをキャッチする必要があります。ここでは2番目の解決方法があります。

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

とクラスMyListenerのdefination提供:

class MyListener implements ApplicationListener<ContextClosedEvent>{ 

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

注:第二の溶液は、Tomcatや他のWebコンテナとは何の関係もありませんフォローなどのアプリケーションmainメソッドを変更

。 ContextClosedEventはSpringドキュメントには導入されていませんが、ソースで見つかったので、とても便利です。

これが何かを助けることができれば非常にうれしいです。

関連する問題