2012-02-20 52 views
1

30分ごとにジョブが実行されるようにCronExpressionが設定されています。しかし、前の仕事が完了していなければ、特定の仕事をスキップする必要があります。Spring Quartz Schedulerで特定のジョブの実行をスキップする方法

たとえば、私は100人の従業員がデータベースで更新され、私は10amで始まる "ジョブ1"と言います。今の場合、「ジョブ1」が処理中で、別のジョブがあるときには、「ジョブ2」が、別の50人の従業員の名前を更新する必要がある場所に揃えられます。私の問題はこれです、私は "Job2"と私の現在実行中のジョブが完了するまで、さらにジョブをスキップする必要があります。

<bean name="employeeNameUpdateJob" class="org.springframework.scheduling.quartz.JobDetailBean"> 
     <property name="name" value="Employee Update Job"/> 
     <property name="group" value="Employee Update Group Job"/> 
     <property name="jobClass" 
      value="com.emp.scheduler.EmployeeUpdateScheduler" /> 
     <property name="volatility" value="false" /> 
    </bean> 

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
     <property name="name" value="Employee Update Trigger"/> 
     <property name="group" value="Employee Update Group Trigger"/> 
     <property name="volatility" value="false" /> 
     <property name="jobDetail" ref="employeeNameUpdateJob"/> 
     <property name="cronExpression" value="0 0/30 * * * ?"/> 
    </bean> 

答えて

1

彼らは同じジョブ・クラスの場合は:@DisallowConcurrentExecution

エルス

あなたは、単一のスレッドプールエグゼキュータを使用する必要があるように聞こえます。両方のクラスに同じエグゼキュータを注入します(またはこれを管理するためにオーケストレータークラスを実装します)。そして、この方法でキューに作業単位を追加します。

3

TriggerListenerインターフェイスを実装する方法の1つは、vetoJobExecution(Trigger trigger, JobExecutionContext context)メソッドを使用して次のジョブの実行を拒否する方法です。このメソッドからtrueを返すと、ジョブの実行が停止します。

インタフェースのドキュメント:http://quartz-scheduler.org/api/2.0.0/org/quartz/TriggerListener.html#vetoJobExecution(org.quartz.Trigger、org.quartz.JobExecutionContext)

サンプル:

//SampleTriggerListener.java 
public class SampleTriggerListener implements TriggerListener { 

    @Override 
    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext ctx) { 
     if(!previousJobCompleted) 
      return true; 

     return false; 
    } 
} 


//Main.java 
//init jobs, trigger & scheduler 
this.scheduler.addTriggerListener(new SampleTriggerListener()); 
this.scheduler.start(); 
0

あなたが並行して複数のジョブを実行する必要はありません場合はクォーツに使用するワーカースレッドプールを設定することができます1.その後、一度に1つのジョブしか実行されません。 quartz.propertiesファイルで、次のように設定します。

org.quartz.threadPool.threadCount: 1 
関連する問題