2

Job を実装するクラス「Applier」があります。クラス「Applier」は、Quartz Job のインスタンスの 1 つであることを意味します。

私の要件は、一度に実行される「Applier」のインスタンス数を制御することです。一度に最大5つの「Applier」インスタンスを実行するように制限したいということです。「Applier」の 6 番目のインスタンスが来て、5 つのインスタンスがすでに実行されている場合、「Applier」のインスタンスの 1 つが完了するまで待機する必要があります。

Quartz Scheduler に待機/通知タイプのメカニズムはありますか。Job の 6 番目のインスタンスが実行を試み、6 番目のインスタンスよりも既に実行中の 5 つのインスタンスが待機し、5 つのインスタンスのいずれかの実行が完了した後に通知する必要がある場合を意味します。

Job の特定のインスタンスに対して ThreadPool タイプのメカニズムを実現したいということです。ThreadPool は必要ありません。Quartz Scheduler レベルの mechanisum と同様に、Quartz Scheduler によって既に提供されています。

4

2 に答える 2

1

同時に実行するジョブの数を制限するか (スレッドプール)、ジョブの特定のインスタンスを 1 つの同時インスタンスのみに制限することができます。特定のジョブを特定のインスタンス数 (1 以外) のみに制限することはできません。やりたいことを実行する唯一の方法は、特定のスケジューラに対して 1 種類のジョブのみを実行し、スレッドプールを同じ時間で実行したいジョブの数に制限することです

于 2014-05-27T15:37:52.737 に答える
1

これを認識しているかどうかはわかりませんが、すべてのジョブは jobkey に固有です。

この回答の規則から始めましょう

JOB -- これはクォーツの仕事を意味します

Job -- Quartz ジョブクラス

前述したように、JOB のインスタンスは 1 つしか存在できません。これがどのように行われるかというと、各 JOB はジョブキーによって定義され、ジョブキーは常に一意になります。

これは、通常、JOB と Job の間に 1 対 1 のマッピングがあることを意味します。つまり、スケジュールされたジョブ (QuartZ ジョブと Job インターフェイスを実装するクラス)

ジョブ -> ジョブ

ケース1

JOB の複数のインスタンスではなく、ジョブの複数のインスタンス

次のようになります

ジョブ A -> ジョブ |

JOB B -> Job |.........同じクラスを実行する複数の JOB

ジョブ C -> ジョブ |

同じジョブグループに異なるジョブキーを保持するだけで、ジョブの複数のインスタンスをスケジューラにロードできます

JobFactoryを見てください。

JobFactory は Job クラスのインスタンスを生成する責任があります。

..

ケース 2

JOBのインスタンスに来ます。スケジュールと JOB の実行時間に基づいて、複数のインスタンスが並行して実行されている可能性があります (複数のインスタンスをより適切な用語として同時実行と呼ぶことは不適切です)。これを回避するには、カスタム ロジックを作成する必要があります。または、アノテーションDisallowConcurrentExecutionを使用します。

ケース 1 に示すように、DisallowConcurrentExecution を持つ Job の 5 つのインスタンスをロードします。ただし、一度にジョブが必要ない場合でも、これは 5 つの不要なインスタンスを意味します。

ケース 3

ここで、1 に初期化されたフラグを設定することを考えてみましょう。これを処理するのに役立つカスタム ロジック

仕事を始める前に。フラグが 5 未満かどうかを確認できます。5 未満の場合は、メインのビジネス ロジックに入り、フラグの値を増やします。実行終了後、ブロックから出る前にデクリメントします。この方法では、JOB の複数のインスタンスが実行されている場合でも、ビジネス ロジックは実行されません。

    private static int jobRunningFlag = 0;

    @Override
public void execute(JobExecutionContext context) throws JobExecutionException {
    if(JobName.jobRunningFlag <= 5)
        {
            JobName.jobRunningFlag++
    .....execute this piece of code....
            JobName.jobRunningFlag--
    }
}

明らかに、jobRunningFlag は同じ Job クラスに格納された静的変数になります。

PS:これに対するより多くの答えは、あなたのコメントに基づいています。JobFactory と関連するクラス/インターフェースを調べましたか。何を試しましたか。私の考えでは、これは完全に実装ロジックに帰着します。私はクォーツがあまり得意ではないので、それらについてあまり知りません。

于 2013-11-14T21:06:05.897 に答える