2015-04-05 675 views
0

我有一个Quartz作业被设置为每隔一段时间运行一次。不过,我想阻止这项工作的并发执行。我将@DisallowConcurrentExecution注释添加到表示此作业的类中,但似乎没有任何作用。Quartz @DisallowConcurrentExecution注解似乎没有工作

以下是我创建作业并触发存储到JDBC存储区的方法。触发器设置为每5秒运行一次。

JobKey jobKey = new JobKey("sample_job", "default_group"); 
    String triggerIdentity = jobKey.getName() + "_trigger"; 
    Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); 
    if (!scheduler.checkExists(jobKey)) { 

     JobDetail jobDetail = JobBuilder.newJob(SampleJob.class).withIdentity(jobKey).build(); 
     Trigger trigger = newTrigger() 
      .withIdentity(triggerIdentity, jobKey.getGroup()) 
      .startAt(new Date()) 
      .withSchedule(simpleSchedule() 
      .withIntervalInSeconds(5) 
      .repeatForever()) 
      .build(); 
     scheduler.scheduleJob(jobDetail, trigger); 

    } 
    scheduler.start(); 

这是我创建的示例作业类。它基本上启动了一个计时器,它在10秒内完成并打印一条消息。

@DisallowConcurrentExecution 
public class SampleJob implements Job { 

    public SampleJob() { 
    } 

    @Override 
    public void execute(JobExecutionContext jobExcutionContext) { 

     final Date now = new Date(); 
     System.out.println("Starting sample job: " + now); 
     Timer t = new Timer(); 
     t.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       System.out.println("Done: " + now); 
       this.cancel(); 
      } 
     }, 10000L); 

    } 
} 

当我运行此我看到下面的输出,这对我来说意味着作业触发,即使以前的执行尚未完成,每5秒关机。我误解了@DisallowConcurrentExecution的含义,还是我的测试不正确?

Starting sample job: Sat Apr 04 22:45:06 EDT 2015 
Starting sample job: Sat Apr 04 22:45:11 EDT 2015 
Done: Sat Apr 04 22:45:01 EDT 2015 
Starting sample job: Sat Apr 04 22:45:16 EDT 2015 
Done: Sat Apr 04 22:45:06 EDT 2015 
Starting sample job: Sat Apr 04 22:45:21 EDT 2015 
Done: Sat Apr 04 22:45:11 EDT 2015 
Done: Sat Apr 04 22:45:16 EDT 2015 
Starting sample job: Sat Apr 04 22:45:26 EDT 2015 
Starting sample job: Sat Apr 04 22:45:31 EDT 2015 
Done: Sat Apr 04 22:45:21 EDT 2015 

回答

0

原来,我是在反思这个问题。一个计时器看起来像是从一个单独的线程运行。所以就工作而言,它是在计时器完成之前完成的。一个简单的Thread.sleep(10000),而不是定时器的技巧。