2009-03-17 7 views
5

バックエンドWebアプリケーションは、Tomcat 6サーブレットコンテナにデプロイされています。 webappでは、いくつかの監視スレッドが開始されます。シャットダウンに問題があります。tomcatで実行中のWebアプリケーションが所有するローカルスレッドを正しくシャットダウンする方法

  • ウェブアプリケーションのシャットダウンが要求されていることをどのように知ることができますか?
  • スレッドでこれをどのように処理する必要がありますか?

現在、私のスレッドは以下のように実装されています。サーブレットがシャットダウン(shutdown.sh)を指示されると、クリーンシャットダウンは完了し、このスレッドのためにハングアップしません - なぜですか?シャットダウンするように指示された場合

class Updater extends Thread { 
    volatile boolean interrupted = false; 

    @Override 
    public void run() { 
    Integer lastUpdateLogId = CommonBeanFactory.getXXX() 
           .getLastUpdateLogRecordKey(MLConstants.SMART_DB_NAME); 

    List<UpdateLog> updateLogRecords; 
    while (!interrupted) { 
     boolean isConfigurationUpdateRequested = false; 

     try { 
     TimeUnit.SECONDS.sleep(5); 
     } catch (InterruptedException e) { 
     setInterrupted(true); 
     } 

     updateLogRecords = CommonBeanFactory.getXXX() 
         .getLastFactsUpdateLogRecords(MLConstants.XXXX, lastUpdateLogId); 

     for(UpdateLog updateLog : updateLogRecords) { 
     if (updateLog.getTable_name().equals(MLConstants.CONFIG_RELOAD)) { 
      isConfigurationUpdateRequested = true; 
     } 

     lastUpdateLogId = updateLog.getObjectKey(); 
     } 

     if (isConfigurationUpdateRequested) { 
     Configuration.getInstance().loadConfiguration(); 
     } 
    } 
    } 

    public boolean getInterrupted() { 
    return interrupted; 
    } 

    public void setInterrupted(boolean interrupted) { 
    this.interrupted = interrupted; 
    } 
} 

答えて

3

サーブレットは、ライフサイクルイベントを受け取ります。このイベントを使用して、監視スレッドを停止することができます。つまり、サーブレットが起動されると、そのメソッドのinit()が呼び出されます。停止すると、destroy()メソッドが呼び出されます。

サーブレットでdestroy()メソッドをオーバーライドし、そこでスレッドを停止します。

shutdown.shを呼び出すと、JVM全体がシャットダウンします。 JVMは停止しているため、実行中のスレッドは強制的に停止されます。それは呼び出しの論理同等ですSystem.exit(0);

5

私はまだ答えに返信することはできないと思います。エディの答えはあまり正確ではありません。

なぜ私のwebappが正常にシャットダウンされないのか理解しようとしているので、この質問が見つかりました。シャットダウンを実行してもスレッドが殺されない*。実際、いくつかのスレッドを停止しますが、最終的にはいくつかのリムボ状態になってしまいます。私のクラスは実際にはこのクラスとほぼ同じです。

フォアグラウンドでCtrl + Cを押すと、Tomcatウィンドウ(Windowsの場合)はすべて停止しますが、Tomcatに付属のinitスクリプトを使用しても機能しません。残念ながら、私はまだ理由を理解していません...

編集:私はそれを理解しました。ほとんどの監視スレッドはServletContextListenerで開始されますが、そのコンテキストが「破棄」されたときに子スレッドに通知されませんでした。私はそれを単純にすべての子スレッドをListにしてループスルーし、contextDestroyed()メソッド内でそれぞれのThread.interrupt()を呼び出して修正しました。 Eddieがservlet destroy()メソッドについて言ったこととほぼ同じです。

シャットダウンを実行すると、JVMが一時的にシャットダウンされるのは間違いです{sh | bat}。このスクリプトは、Tomcatコンポーネントにシャットダウン要求を送信するようなものです。これらのシャットダウンメッセージを受け取って自分のオブジェクトに渡すのはあなた次第です。

関連する問題