2017-06-19 13 views
1

私は定期的な間隔(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

+0

あなたのロジックが何をしているか説明したり、見せたりすることはできますか?あなたがいくつかのメモリリークを持っているように見えるので、あなたのスレッドは各繰り返しの後で決して空にはなりません。 –

+0

スレッドごとにメモリリークが発生し、各繰り返しで空き状態にならない場合がありますか? –

+0

ええ、私の悪い、私はリソースリークを意味しました。一般的には、実行後にスレッドを解放しない何かをしています。あなたを助けるために、あなたは何をしているのかを見る必要があります。また、石英は、前回の完成時にのみ新しい反復を可能にする性質を持っています。これを有効にして、決して実行を終了しない機能に関する問題がないかどうかを確認できます。 –

答えて

0

を持っています。 1分ごとにクォーツキックがあり、1分で仕事が完了しないので、火災や石英が最初に実行しようとすると、それは疲れてしまいます。

このプロセス中に、ミス・ファイアの更新操作が行われ、クォーツが詰まる時間がかかります。 https://jira.terracotta.org/jira/si/jira.issueviews:issue-html/QTZ-357/QTZ-357.html

を私たちのユースケースミス火災は無視することができ、次の実行で拾うことができますについて:これは

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) 

以下を参照して、すべての私たちの石英スレッドでTIMED_WAITING状態にあるスレッドダンプから明らかです。したがって、以下のようにMisfire命令を無視するように変更しました。

<property name="misfireInstructionName" value="MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY" /> 
関連する問題