私は Quartz を使用したプロジェクトに取り組んでおり、ジョブとの依存関係に問題がありました。
A と B が互いに依存していないセットアップがありますが、C は次のとおりです。
A と B は同時に実行できますが、C は A と B の両方が完了した場合にのみ実行できます。
A と B が終了したときにのみ C がトリガーされるように、Quartz でこの種のシナリオを設定する方法はありますか?
私は Quartz を使用したプロジェクトに取り組んでおり、ジョブとの依存関係に問題がありました。
A と B が互いに依存していないセットアップがありますが、C は次のとおりです。
A と B は同時に実行できますが、C は A と B の両方が完了した場合にのみ実行できます。
A と B が終了したときにのみ C がトリガーされるように、Quartz でこの種のシナリオを設定する方法はありますか?
直接知る限りではありませんが、TriggerListener を使用してそのような機能を実装するのはそれほど難しくありません (TriggerListenerはジョブの開始と終了の両方で実行され、個々のトリガーまたはトリガー グループに対して設定できます)。
編集:この問題に関する特定のFAQ トピックもあります。
現在、Quartz でトリガーを連鎖させる「直接的」または「無料」の方法はありません。ただし、それほど努力せずに達成できる方法がいくつかあります。以下は、いくつかのアプローチの概要です。
1 つの方法は、ジョブ/トリガーの完了を認識し、すぐに新しいトリガーの起動をスケジュールできるリスナー (つまり、TriggerListener、JobListener、または SchedulerListener) を使用することです。このアプローチは、どのジョブがどのジョブに続くかをリスナーに通知する必要があるため、少し複雑になる可能性があります。また、この情報の永続性について心配する必要がある場合もあります。Quartz に同梱されているリスナー org.quartz.listeners.JobChainingJobListener を参照してください - すでにこの機能の一部を備えているためです。
もう 1 つの方法は、JobDataMap 内に起動する次のジョブの名前を含む Job を構築し、ジョブが完了すると (execute() メソッドの最後のステップ)、ジョブに次のジョブをスケジュールさせることです。何人かの人々がこれを行っており、幸運に恵まれています。ほとんどの場合、定義済みのキー (定数) を使用して JobDataMap からジョブ名とグループを取得する方法を認識し、識別されたジョブをスケジュールするコードを含むジョブである基本 (抽象) クラスを作成しています。この抽象 Job の execute() の実装は、「doWork()」などの抽象テンプレート メソッド (拡張 Job クラスの実際の作業が行われる場所) に委譲し、その後、フォローアップ ジョブをスケジュールするためのコードが含まれます。次に、ジョブが実行する作業を含むこのクラスの拡張を作成するだけです。「永続的な」ジョブの使用、
将来、Quartz はこれを行うためのよりクリーンな方法を提供する予定ですが、それまでは、上記のアプローチのいずれかを使用するか、より適切に機能する別の方法を考える必要があります。