2017-02-28 7 views
1

私は並列で実行したくないクォーツの2つのジョブインスタンスを持っています。以下の例のコードを単純化して、私の期待に沿わないものを示しました。Quartz @DisallowConcurrentExecutionが動作しません

public class QuartzTest { 

public static void main(String[] args) throws SchedulerException { 
SchedulerFactory schedulerFactory = new StdSchedulerFactory(); 
Scheduler scheduler = schedulerFactory.getScheduler(); 
scheduler.start(); 

JobDetail job1 = newJob(TestJob.class).withIdentity("job1", "group1").build(); 
CronTrigger trigger1 = newTrigger().withIdentity("trigger1", "group1").startAt(new Date()).withSchedule(cronSchedule(getCronExpression(1))).build(); 
scheduler.scheduleJob(job1, trigger1); 

JobDetail job2 = newJob(TestJob.class).withIdentity("job2", "group1").build(); 
CronTrigger trigger2 = newTrigger().withIdentity("trigger2", "group1").startAt(new Date()).withSchedule(cronSchedule(getCronExpression(1))).build(); 
scheduler.scheduleJob(job2, trigger2); 

for (int i = 0; i < 5; i++) { 
    System.out.println(trigger1.getNextFireTime()); 
    System.out.println(trigger2.getNextFireTime()); 
    try { 
    Thread.sleep(1 * 60 * 1000); 
    } catch (InterruptedException e) { 
    e.printStackTrace(); 
    } 
} 
} 

private static String getCronExpression(int interval) { 
return "0 */" + interval + " * * * ?"; 

} 

} 

これは

@DisallowConcurrentExecution 
public class TestJob implements Job { 

    @Override 
    public void execute(JobExecutionContext context) throws JobExecutionException { 
    System.out.println("Job started"); 
    System.out.println("Job sleeping 30s..."); 
    try { 
     Thread.sleep(30 * 1000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("Job finished."); 
    } 

} 

だからここで私は(実際のケースでは、一方が他方のすべての5分ごとに実行されている)毎分を実行するために、2つのジョブをスケジュールしていますし、これが出力されるジョブ・クラスであります私は取得しています:

Job started 
Job sleeping 30s... 
Job started 
Job sleeping 30s... 
Job finished. 
Job finished. 

だから、両方のジョブが並列に実行されている、JOB1が待機JOB2を実行する前に完了させるために、シーケンシャル順序が私にこのシーケンスを与えるため

Job started 
Job sleeping 30s... 
Job finished. 
Job started 
Job sleeping 30s... 
Job finished. 

なぜこのようなことは起こりませんか?ドキュメントから

答えて

0

@DisallowConcurrentExecution:

インスタンスがベースの際さJobDetail定義同時に実行複数のインスタンスを持っていなければならない一方(としてジョブ・クラスをマークアノテーション - 又は言い換えますJobKeyに基づいて)。

JobKeyはあなたの例では名前やグループ

の両方で構成されている名前は同じではありませんので、これは二つの異なる仕事です。

DisallowConcurrentExecutionは、別のジョブを開始する前にjob1#thread1が完了していることを保証しています。#thread2。

関連する問題