我是Quartz的新手,并且卡在重复的作业中。
它们是由两个触发时间重叠的触发器引起的。
是否有Quartz的“开箱即用”功能,可以防止在多个附加触发器的情况下重复执行同一作业?
或者,也许有一些第三方Trigger
实现允许将时间表与正确的启动时间计算结合起来,以防止重复启动时间?
或者,也许我可以以某种方式组合多个时间表?
任何解决方案将不胜感激。
谢谢
为了清楚起见:
public static class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("My Job at " + DateUtils.toDateTimeString(context.getFireTime()) + " by " +
context.getTrigger().getKey().getName());
}
}
startScheduler() {
final Set<Trigger> triggers = new HashSet<Trigger>();
triggers.add(TriggerBuilder.<CronScheduleBuilder>newTrigger().withIdentity("every 3 secs").
withSchedule(CronScheduleBuilder.cronSchedule("0/3 * * * * ? *")).build());
triggers.add(TriggerBuilder.<CronScheduleBuilder>newTrigger().withIdentity("every 2 secs").
withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ? *")).build());
final Scheduler scheduler = new StdSchedulerFactory(properties).getScheduler();
scheduler.scheduleJob(JobBuilder.newJob(MyJob.class).build(), triggers, false);
scheduler.start();
}
和日志:
我的工作在每2秒01.11.2013T23:19:26.000
我的工作在每3秒01.11.2013T23:19:27.000
我的工作在每2秒01.11.2013T23:19:28.000
我的工作在每2秒01.11.2013T23:19:30.000
每3秒在01.11.2013T23:19:30.001我的工作
我的工作在01.11.2013T23:19:32.000每2秒
我的工作在每3秒01.11.2013T23:19:33.000
我的工作在01.11.2013T23:19:34.000每2秒
我的工作在01.11.2013T23:19:36.000每2秒
我的工作在每3秒01.11.2013T23:19:36.001
我的工作在01.11.2013T23:19:38.000每2秒
我的工作在每3秒01.11.2013T23:19:39.000
每2秒在01.11.2013T23:19:40.000我的工作
我的工作在每2秒01.11.2013T23:19:42.001
我的工作在每3秒01.11.2013T23:19:42.002
最佳答案
发现TriggerListener
适用于此任务:
scheduler.getListenerManager().addTriggerListener(new TriggerListener() {
private Date lastFireTime = null;
@Override
public String getName() {
return "prevent-duplicate-fires";
}
@Override
public void triggerFired(Trigger trigger, JobExecutionContext context) {
}
@Override
public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
final Date fireTime = context.getScheduledFireTime();
if (lastFireTime != null && fireTime.equals(lastFireTime)) {
return true;
}
lastFireTime = fireTime;
return false;
}
@Override
public void triggerMisfired(Trigger trigger) {
}
@Override
public void triggerComplete(Trigger trigger, JobExecutionContext context, Trigger.CompletedExecutionInstruction triggerInstructionCode) {
}
});
看起来有效:
我的工作在01.11.2013T23:46:14.000每2秒
我的工作在每3秒01.11.2013T23:46:15.000
我的工作在每2秒01.11.2013T23:46:16.000
我的工作在01.11.2013T23:46:18.000每2秒
--->应该被触发但被跳过-我的工作每3秒01.11.2013T23:46:18.000
我的工作在01.11.2013T23:46:20.000每2秒
每3秒在01.11.2013T23:46:21.000我的工作
我的工作在01.11.2013T23:46:22.000每2秒
我的工作在每2秒01.11.2013T23:46:24.000
--->应该触发但被跳过-我的工作每3秒01.11.2013T23:46:24.000
我的工作在01.11.2013T23:46:26.000每2秒
每3秒在01.11.2013T23:46:27.000我的工作
关于java - quartz :跳过计划在相同点火时间进行的重复作业点火,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19733981/