Java Quartz@DisallowConcurrentExecution注释似乎不起作用
我有一个Quartz作业,设置为定期运行。但是,我希望防止同时执行此作业。我向表示此作业的类添加了@DisallowConcurrentExecution注释,但这似乎没有任何效果 下面是我如何创建作业和触发器以存储到JDBC存储中。触发器设置为每5秒运行一次Java Quartz@DisallowConcurrentExecution注释似乎不起作用,java,quartz-scheduler,Java,Quartz Scheduler,我有一个Quartz作业,设置为定期运行。但是,我希望防止同时执行此作业。我向表示此作业的类添加了@DisallowConcurrentExecution注释,但这似乎没有任何效果 下面是我如何创建作业和触发器以存储到JDBC存储中。触发器设置为每5秒运行一次 JobKey jobKey = new JobKey("sample_job", "default_group"); String triggerIdentity = jobKey.getName() + "_trigge
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();
下面是我创建的示例job类。它基本上会启动一个计时器,在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
原来我对这个问题想得太多了。计时器似乎是从一个单独的线程中运行的。就工作而言,它是在计时器完成之前完成的。一个简单的线程。睡眠(10000)代替计时器完成了这个任务