2017-10-20 5 views
0

基本的には、私はQuartz Schedulerの実装を使用しています。同時に複数のジョブを実行したいが、いくつかは他のタスクの前に実行する必要があります。このために、私はトリガのパラメータ "優先度"を見つけました。クォーツスケジューラのトリガは優先度を尊重しません

だから私は4つのジョブがあり、それぞれに独自のトリガーがあります。 - 優先順位5 JOB2 - 優先順位3 JOB3 - 優先順位11 JOB4 - JOB1優先8

私は彼らがこの順序で実行することにしたい:私はこのような優先順位を設定JOB3、JOB4、仕事をし、 1、job2

20回の実行のうち、約3回だけ期待される結果が得られます。他の人にとって、実行される最初のタスクは非常にランダムであり、残りは正しく順序付けられます。 JOB1、JOB3、JOB4、JOB2 OR JOB4、JOB3、JOB1、JOB2

アム私は優先順位がクォーツでどのように機能するかを正しく理解していない:一つの実行は次のようになるでしょうか?私は起こっていることを正確に見つけることができません。

+0

あなたのスレッドプールのサイズは?利用可能なスレッドより多くのタスクが実行されている状況に実行しますか?すべてのジョブが同じスケジュールされた時間を持っていて、クォーツがスレッドを実行するためにフリースレッドを持っていない場合、すべての優先順位がキックされますか。 – Srinivas

+0

スレッドプールサイズは1ですこの例のようにhttp://www.quartz-scheduler.org/documentation/quartz-2.x/examples/Example14.html私は優先度に基づいてタスクを実行する必要があります。 – Mocktheduck

+0

2つのこと。 1)あなたの仕事はどのように予定されていますか?あなたはすべての仕事のために同じcronを持っていて、同時に発射することを期待していますか?あるいはintervalWithDelayのようなものを複数回実行するようにしますか? 2)あなたの仕事のためにNextFireTimeを見ると、より多くの洞察を与えるかもしれません。優先順位は、すべてのジョブが同時に発生するようスケジュールされている場合にのみ表示されます。彼らの発射時間が異なる場合、最も古くスケジュールされたToFire時間を持つ仕事は、彼らが同じNextFireTimeを持っていたことを確認することができる – Srinivas

答えて

0

ここで問題となるのは、異なる優先度で同時に複数のジョブをスケジュールすると、作業スレッドがすでにビジー状態になっている場合を除き、望む順序でそれらを取得できることです。それ以外の場合、作業スレッドがビジーでない場合は、ナノ秒のスパンでスケジューリングできる最も優先度の高いジョブを選択します。

私の場合、スレッドはビジーではなかったので、すべてのジョブのスケジューリング中に、クォーツはスケジュールした最初のジョブを処理して処理する時間がありました。残りのジョブは、スレッドがジョブ1を処理している間にスケジュールされる時間がありました。

あなたは自分で問題を追跡するために、「一括取得...」というメッセージに従うことができます。

私の解決方法は、ジョブリストのメソッドスケジュールを使用することです。

関連する問題