これを認識しているかどうかはわかりませんが、すべてのジョブは 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 と関連するクラス/インターフェースを調べましたか。何を試しましたか。私の考えでは、これは完全に実装ロジックに帰着します。私はクォーツがあまり得意ではないので、それらについてあまり知りません。