2016-09-28 12 views
1

私はSpringブートアプリケーションをTomcat 8にデプロイしました。アプリケーションが起動すると、Spring Autowiresがいくつかの依存関係を持つバックグラウンドでワーカースレッドを開始します。現在、私は、この持っている:私のドッカーテスト環境でSpringブート - デプロイ時にバックグラウンドスレッドを開始する最も良い方法

@SpringBootApplication 
@EnableAutoConfiguration 
@ComponentScan 
public class MyServer extends SpringBootServletInitializer { 

    public static void main(String[] args) { 
     log.info("Starting application"); 
     ApplicationContext ctx = SpringApplication.run(MyServer.class, args); 
     Thread subscriber = new Thread(ctx.getBean(EventSubscriber.class)); 
     log.info("Starting Subscriber Thread"); 
     subscriber.start(); 
    } 

を、これはうまく動作します - しかし、私はTomcatを8での私のLinux(Debianのジェシー、ジャワ8)ホストにこれを展開するとき、私は「開始加入者スレッド」を見ることはありませんメッセージ(スレッドは開始されていません)。

+0

あなたはhttp://docs.spring.io/spring-boot/docs/current/apiのJavadocを読みました/org/springframework/boot/context/web/SpringBootServletInitializer.html - なぜ 'main'メソッドがあるのか​​分かりません。 –

+0

したがって、Tomcatを使わずにスタンドアロンサーバーとしても実行できます。 – Gandalf

+1

と '' tomcat'環境でこれを 'main'と呼んでいるのは何ですか? –

答えて

4

メインアプリケーションは、組み込みアプリケーション以外のアプリケーションサーバーにアプリケーションをデプロイするときに呼び出されません。 スレッドを開始する最も簡単な方法は、Beanコンストラクタから行うことです。また 例えば、コンテキストが閉じているときに、スレッドをクリーンアップすることをお勧め:

@Component 
class EventSubscriber implements DisposableBean, Runnable { 

    private Thread thread; 
    private volatile boolean someCondition; 

    EventSubscriber(){ 
     this.thread = new Thread(this); 
    } 

    @Override 
    public void run(){ 
     while(someCondition){ 
      doStuff(); 
     } 
    } 

    @Override 
    public void destroy(){ 
     someCondition = false; 
    } 

} 
+1

クラスレベルで@Beanを追加することはできません。https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Bean.html –

+0

良い点、私はそれを代わりに '@ Component'に変更しましたが、あなたは本当に必要なBeanを登録することができます。 – Magnus

0

インプエレメントが埋め込まれたBeanを持つことができますApplicationListener<ContextRefreshedEvent>onApplicationEventはまだ起動されていない場合にのみスレッドを開始します。ところで、あなたはApplicationReadyEventが欲しいと思います。

関連する問題