5

私はQuartzでプロジェクトに取り組んでおり、ジョブとの依存関係に問題があります。

Cは次のとおりですが、AとBが相互に依存しない設定があります。

AとBは同時に実行できますが、CはAとBの両方が完了した場合にのみ実行できます。

この種のシナリオをQuartzで設定して、AとBが終了したときにのみCがトリガーされるようにする方法はありますか?

4

1 に答える 1

7

これが現在の方法だと思います: http ://www.quartz-scheduler.org/documentation/faq#FAQ-chain

このFAQに基づいて、AとBが終了するのを待つジョブリスナーを作成し、それが発生したらジョブCをスケジュールすることができます。

PS:リンクが変更された場合のテキストは次のとおりです。

ジョブの実行を連鎖させるにはどうすればよいですか?または、ワークフローを作成するにはどうすればよいですか?

現在、Quartzでトリガーをチェーンする「直接」または「無料」の方法はありません。ただし、多くの労力をかけずにそれを達成できる方法はいくつかあります。以下は、いくつかのアプローチの概要です。

1つの方法は、ジョブ/トリガーの完了を通知し、すぐに新しいトリガーを起動するようにスケジュールできるリスナー(つまり、TriggerListener、JobListener、またはSchedulerListener)を使用することです。どのジョブがどのジョブに従うかをリスナーに通知する必要があるため、このアプローチは少し複雑になる可能性があります。また、この情報の永続性について心配する必要がある場合があります。Quartzに同梱されているリスナーorg.quartz.listeners.JobChainingJobListenerを参照してください。これには、すでにこの機能の一部が含まれているためです。

もう1つの方法は、JobDataMap内に起動する次のジョブの名前を含むジョブを作成し、ジョブが完了すると(execute()メソッドの最後のステップ)、ジョブに次のジョブをスケジュールさせることです。何人かの人々がこれをやっていて、幸運に恵まれました。ほとんどは、事前定義されたキー(定数)を使用してJobDataMapからジョブ名とグループを取得する方法を知っているJobであり、識別されたジョブをスケジュールするためのコードを含む基本(抽象)クラスを作成しました。この抽象ジョブのexecute()の実装は、「doWork()」(拡張ジョブクラスの実際の作業が行われる)などの抽象テンプレートメソッドに委任し、フォローアップジョブをスケジュールするためのコードが含まれています。次に、ジョブが実行する必要のある作業を含むこのクラスの拡張を作成するだけです。「耐久性のある」ジョブの使用法、

将来的には、Quartzはこれを行うためのはるかにクリーンな方法を提供しますが、それまでは、上記のアプローチの1つを使用するか、より適切に機能する別のアプローチを検討する必要があります。

于 2013-12-14T22:11:29.180 に答える