2017-04-13 23 views
4

私はSpringブートを初めて使いました。@PreDestroyアノテーションを無視しているようなSpringブートアプリケーションがあります。コマンドラインやEclipseから実行すると、Springブート@PreDestroyアノテーションが動作しない

コードは以下の通りです決してアプリケーションがシャットダウンされるとき、実行している@PreDestroyコードを見ていない(例えば経由してCtrl + Cキー)...

Application.java:

@SpringBootApplication 
public class Application { 

    @Autowired 
    private MessageProcessor messageProcessor; 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

    @PostConstruct 
    public void init() {  
     messageProcessor.run(); 
    } 

} 

メッセージプロセッサ設定:

@Configuration 
public class MessageProcessorConfiguration { 

    @Bean 
    public MessageProcessor messageProcessor() { 
     return new MessageProcessorImpl(); 
    } 
} 

メッセージプロセッサ:コンテキスト作成 中

public class MessageProcessorImpl implements MessageProcessor { 

    @Override 
    public void run() { 

     while (isActive()) { 
      … 
     } 
    } 


    @PreDestroy 
    public void shutdown() { 
     System.out.println("MessageProcessorImpl - shutting down"); 
    } 

} 
+1

PreDestroyアノテーションは、** container **によってインスタンスが**削除**されていることを通知するコールバック通知としてメソッドに使用されます。アプリケーションの事前シャットダウンではありません。 –

+0

So @PreDestroyは、実行中のアプリケーションでctrl-cを使うか、をkillすると起動しませんか?このイベントをキャッチするために何かできることはありますか? – finbin

+0

この質問を見るhttp://stackoverflow.com/questions/23936162/register-shutdownhook-in-web-application –

答えて

1

春ブーツ・レジスタのシャットダウンフックはorg.springframework.context.support.AbstractApplicationContext#registerShutdownHook方法を参照してください。 java -jar app.jar cmdを使用してアプリを実行していて、@Predestroyメソッドをトリガーする場合は、結果コンテキストをcrtl + cの組み合わせで閉じる必要があります。これは私のために働く。

コードには何も記載されていません。私はあなたのMessageProcessorImplのbeanに、手動の@Bean宣言の代わりに@Component注釈を付けることを提案することができます。

関連する問題