2012-03-19 25 views
3

私は2つのジョブを持っています。それらは、単に行を出力し、トリガーやタイムアウトが定義されていないスーパー単純なジョブであると考えてください。 <name of my class>Job.triggerNow()別のジョブが完了したらジョブをトリガーするにはどうすればよいですか?

私が欲しいのは、1つのジョブをトリガーし、それが完了するときに結果的に異なるジョブをトリガーすることです。

私はquartzSchedulerを使ってみましたが、仕事のクラスからJobDetailを得ることができないので、これを行う正しい方法がわかりません。私はまた、最初の仕事の結果を2番目の仕事に渡したいと思っています。

私は、私の最初の仕事の実行方法の最後の行として2番目の仕事を引き起こすことができますが、これは技術的には最初の仕事の一部ではないので好ましくありません。

ご協力いただきますようお願い申し上げます。ありがとう

+0

申し訳ありませんが(そうGroovyとJavaを使用していないIM)、これはGrailsの石英を使用していることを言及する提案のための –

答えて

2

あなたが後を向いているように聞こえるのは、作業中の非同期「パイプライン」であり、すべての作業者が一列に並んでいて、次々に作業するデータを渡します。アーキテクチャのこの種の驚くほど柔軟性があり、私はGrailsので所定の位置に、このようなアーキテクチャを取得することが分かってきた

最良の方法はRabbitMQのように、メッセージキューを使用することで非常に一般的なアプリケーションの数に適用されますたとえば一連のキュー(パイプラインの各ステップごとに1つずつ)を使用して、パイプラインの最初のステップにメッセージを挿入させることができます。

次に、優秀なサービスを使用しているGrailsアプリ内のサービス(仕事の仕事を保持するキューを待ち受ける)があります。作業がキューに入ると、ワーカーはそのジョブをポップして処理し、パイプラインの次のステップのキューにメッセージを入れます。

これは、必要に応じて個々の部分を個別にスケーリングすることができ、あまりオーバーヘッドがないため、これを非同期パイプラインの設計に最適な方法としています。 です。パイプラインの次のステップについてジョブを分からなくする方法もありますが、ほとんどの場合、これは本当に必要ではなく、無駄な複雑さを増やします。

クォーツは、スケジュールで発生する必要がある仕事のための素晴らしいですが、それは

+0

感謝を忘れてしまいました。だから、私はまだバックグラウンドで石英ジョブを使用してサービスやコントローラを介してのRabbitMQを経由してそれらを接続することができ、明確にするために、または私は通常のJava/Groovyクラスへ、またはサービスに私の「仕事」を移動する必要があり、そこから行きますか? schedule_ _on、私たち石英ジョブを発生する必要があるすべてのタスクについては –

+0

。より多くの労働者が仕事のキューを見て、彼らが来るようにそれらを処理し、仕事をするキューに(ちょうどGrailsのサービスです)リスナーを作成するために、RabbitMQのプラグインを使用したように振る舞うべきで任意のタスクの場合。違いは、石英ジョブが周期的であるとRabbitMQのジョブが早く彼らができるようにジョブを処理しています。 – cdeszaq

0

JobListener

あなた@見てくださいスケーラブルな方法ででてくるようパイプラインは処理の事ではるかに優れています利用できる

public void jobWasExecuted(JobExecutionContext context, 
      JobExecutionException jobException); 
0

Redisのキューメッセージング技術を使用している私のWebアプリケーションでこれと似たものを構築しました。私は単にすべてのジョブの依存関係の構造を定義し、唯一の目的は他のジョブの状態を監視/更新し、必要に応じて従属ジョブを起動することです。

各ジョブは、Redisキューを使用して実行中/終了/キャンセルのステータスを報告する必要があります。マスタジョブは各キューメッセージをポップし、適切に処理します。

関連する問題