私は定期的な間隔(1分)で動作するQuartzジョブ(クラスタ化された)を持つSpringを持っています。サーバーの起動時に問題はないようですが、しばらくしてからジョブが起動することはありません。サーバーを再起動するとジョブが実行されますが、しばらくしてから問題が再発生します。すべてのQuartz SchedulerスレッドはTIMED_WAITINGに移動しますか?
私はそれがスレッドの枯渇の問題であると思っていました。スレッドダンプから、私のすべてのQuartzスレッド(10)がTIMED_WAITINGになっていることに気付きました。
設定:
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
スレッドダンプ:私はログから確認し石英2.2.1(それはバージョン固有の問題になることができれば、私は疑う)
を使用して
quartzScheduler_Worker-10 - priority:10 - threadId:0x00007f8ae534d800 - nativeId:0x13c78 - state:TIMED_WAITING stackTrace:
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000066cd73220> (a java.lang.Object)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)
- locked <0x000000066cd73220> (a java.lang.Object)
DB接続の問題がないことを確認します。
問題の診断にお役立てください。システムリソース(スレッド数)を最大限に引き出した可能性はありますか?しかし、私の仕事は同期しており、そのすべての子スレッドがそのタスクを完了したときにのみ存在し、私はまた、根本的な原因は、私たちが水晶の仕事であまりにも多くのミス火災を持っていたこの注釈@DisallowConcurrentExecution
あなたのロジックが何をしているか説明したり、見せたりすることはできますか?あなたがいくつかのメモリリークを持っているように見えるので、あなたのスレッドは各繰り返しの後で決して空にはなりません。 –
スレッドごとにメモリリークが発生し、各繰り返しで空き状態にならない場合がありますか? –
ええ、私の悪い、私はリソースリークを意味しました。一般的には、実行後にスレッドを解放しない何かをしています。あなたを助けるために、あなたは何をしているのかを見る必要があります。また、石英は、前回の完成時にのみ新しい反復を可能にする性質を持っています。これを有効にして、決して実行を終了しない機能に関する問題がないかどうかを確認できます。 –