2011-06-23 16 views
12

私はgrailsでquartzの仕事をしていますが、それは5秒ごとに実行する必要がありますが、これは逐次必要です。いくつかの状況では、ジョブの実行はこの5秒を超えています。この場合、プレビュアの除外が完了していない間は実行したくありません。これをgrailsでどのように設定するのですか?Grailsでのジョブの同時実行を防ぐには?

(もちろん全体魔法は、静的な揮発性フラグを使用して行われますが、これを行うには非常にエレガントな方法ではないことができる) (また、どのように私はシングルトンであることをジョブに設定することができますか?)

THX

答えて

21

を行います

def concurrent = false 
から3210

:デフォルトのジョブによる

」同時的に実行されているので、新しいジョブの実行は、同じジョブの前回の実行がまだ実行されている場合でも始めることができます。あなたは、この動作を無効にしたい場合は、「同時」プロパティを使用することができ、この場合にはクォーツのStatefulJobは、「

+1

ええ、これは解決策ですが、私はこれがタスクの継続的な蓄積を妨げないと思いますキュー... – csviri

+1

OutOfMemoryが発生するまでタスクキューが大きくならないようにするには? – csviri

+0

多くの場合、タスクを待ち行列に入れたい場合、1つの長いタスクは、タスクが「カウント中」または「ステップバイステップ」タイプのタスクのときに他の実行を停止してはいけません。これが実際問題であれば、Quartzはおそらくあなたが望むものではないでしょう。あなたが望むのは、常にループで動作するスレッドです。これを制限する必要がある場合は、Thread.sleep(remainingTime)を遅延させることができます。 –

2

あなたはGrailsの石英プラグインを使用していることを、あなたは自分の仕事にこれを追加することができるはずと仮定すると、あなたの仕事のクラスimplement StatefulJob instead of Job

+1

これは問題ありませんが、これらのソリューションはGrails環境では機能しません。 – csviri

+0

私は設定できませんでした。 – csviri

-1

を使用することになると私は春のタスクを使用して、石英せずにそれを実装:

beans = { 
    xmlns task: "http://www.springframework.org/schema/task" 

    task.'scheduler'('id':"myScheduler", 'pool-size':"1") 

    task.'scheduled-tasks'('scheduler':"myScheduler") { 
     task.'scheduled'(ref:"myBean", method:"myBeanMethodToExec", 'fixed-delay':5000) 
    } 
} 

(プールサイズ1は必要ではないと思いますが、確かに100%です))

+1

あなたは質問をしてから、質問に答えなかった回答を選択しました。これは、あなたが何を使い終わったかにかかわらず、あなたが求めた質問に対処するための最良の答えではありません。 –

+0

はい、あなたは正しいですが、私は「彼がタスクをキューに蓄積し続けるのを妨げない」と書いたが、私はこのアプローチを思いついた。これは実際にこのスプリングスケジューラで解決された。しかし、あなたは正しいです、それは私の質問の良い答えです。 – csviri

関連する問題