2012-07-05 27 views
5

私の状況は次のようなものです:Tomcatのシャットダウンshutdown.shを呼び出した後に非常に遅いですか?

いつもweb-appフォルダにwarファイルをアップロードする前に、私はsh shutdown.shを呼び出してTomcatを停止します。これは、全シャットダウンに約30秒かかっていました。しかし今はもううまくいきません。

実際には、Webページからアプリケーションにアクセスすると503エラー(Under Maintenance)が発生するため、実際にはいくつかの作業を行いました。しかし、ps aux | grep tomcatを使って確認すると、tomcatプロセスはまだそこにあります。そして、それは約5〜10分の間そこにあるでしょう。

すべてのタスクを完了するために余分な時間がかかることがありますが、それは完全に停止するには遅すぎます(5〜10分)ことを理解しています。なぜこのようなことが起こるのか分かりませんが、何らかの理由があるはずです。おそらく、コードや、最近使用した新しい展開スクリプトと関連するものがあります。私はちょうどどこをチェックするかについてのほとんどの手がかりを持っていません。

これは、私たちがwarファイルを自動パッケージ化し、特定の時間にアップロードして展開するスクリプトを使用する「自動展開」を使用しているため、私たちのチームにとって重要です。古いものが正常にシャットダウンする前に新しいTomcatインスタンスを起動した場合、永遠にそこにハングアップし、 "kill -9"によるタスクをクリーンアップするのは大変です。

この問題を実験した人はいますか?どんな手がかりも感謝します。

+1

Qを参照してください。それは、この5〜10分を取っているときに、最後のものは、ログに何ですか?また、 "ps -eaf"はあなたに手がかりを与えますか(または、CPU使用率ゼロのJavaプロセスを見ていますか?) Tomcatのバージョンは何ですか?あなたのOS?また、 "ps"で "java"プロセスが "ハングする"ことがわかったら、スタックトレースを取得する必要があります:http://wiki.apache.org/tomcat/HowTo#How_do_I_obtain_a_thread_dump_of_my_running_webapp_.3F – paulsm4

+0

@ paulsm4:ログを見るshutdown.shを呼び出した後でも、私のQuartzジョブはまだ実行されていることがわかります。 SEVERE:Webアプリケーション[/ project]が[BasicResourcePool.close()のResource Destroyer]というスレッドを開始したように見えますが、停止できませんでした。これはメモリリークを引き起こす可能性が非常に高いです。 –

+0

@ paulsm4:ところで、私は石英の仕事を約10秒間実行しています。これは問題になりますか? –

答えて

2

ホーエンロング -

ありがとうございます。

1)あなたはクォーツジョブが実行されている参照事実、およびエラーメッセージを、両方の意味がある:

SEVERE:Webアプリケーション[/プロジェクト]を スレッドという名前の[リソースを開始しているように見えますBasicResourcePool.close()]のデストラクタで、 がそれを停止できませんでした。これはメモリリークを引き起こす可能性が非常に高いです。

2)1つの提案は、コンフィギュレーションです:

http://forum.springsource.org/showthread.php?17833-Spring-Quartz-Tomcat-no-shutdown

私は同じ問題を抱えていました。 SchedulerFactoryBean定義に destroy-method="destroy"を追加して修正しました。 この方法では、アプリケーションが が停止したときにスケジューラを終了します。

3)もう一つの提案は、シャットダウン・リスナーを追加することです:

http://forums.terracotta.org/forums/posts/list/15/4341.page

は、コンテキスト・リスナーを使用し、シャットダウン時にタイムアウトを導入する私のため 問題を解決します。これは、神秘的な最後の数日以内に起こることを始めた何かであれば、

public void contextDestroyed(ServletContextEvent sce) { 
    try { 
     factory.getScheduler().shutdown(); 
     Thread.sleep(1000); 
+0

私は考え出したと思う:主な理由は、私はまだトランザクションクオーツジョブを実行しているということです。答えの3番目のメソッドについて、私はこのタスクのためにSpring "ContextLoaderListener"をオーバーライドする必要があるのですか? –

関連する問題