Java Quartz:跳过计划在相同启动时间进行的重复作业启动
我是石英的新手,一直在重复作业。 它们是由两个触发点引起的,触发时间重叠 是否有任何Quartz“开箱即用”功能可以防止同一个作业的多个附加触发器重复触发 或者可能有第三方Java Quartz:跳过计划在相同启动时间进行的重复作业启动,java,quartz-scheduler,Java,Quartz Scheduler,我是石英的新手,一直在重复作业。 它们是由两个触发点引起的,触发时间重叠 是否有任何Quartz“开箱即用”功能可以防止同一个作业的多个附加触发器重复触发 或者可能有第三方触发器实现,允许将计划与适当的消防时间计算相结合,以防止重复消防时间 或者我可以把多个时间表结合起来 任何解决方案都将不胜感激 谢谢 为了清楚起见: public static class MyJob implements Job { @Override public void execute(JobExecu
触发器
实现,允许将计划与适当的消防时间计算相结合,以防止重复消防时间
或者我可以把多个时间表结合起来
任何解决方案都将不胜感激
谢谢
为了清楚起见:
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();
}
公共静态类MyJob实现作业{
@凌驾
public void execute(JobExecutionContext上下文)引发JobExecutionException{
System.out.println(“我在”+DateUtils.toDateTimeString(context.getFireTime())+“by”的作业”+
context.getTrigger().getKey().getName());
}
}
startScheduler(){
final Set triggers=new HashSet();
triggers.add(TriggerBuilder.newTrigger().withIdentity)(“每3秒一次”)。
withSchedule(CronScheduleBuilder.cronSchedule(“0/3****?*”)).build();
triggers.add(TriggerBuilder.newTrigger().withIdentity)(“每2秒”)。
withSchedule(CronScheduleBuilder.cronSchedule(“0/2****?*”)).build();
final Scheduler=new StdSchedulerFactory(properties).getScheduler();
scheduleJob(JobBuilder.newJob(MyJob.class).build(),触发器,false);
scheduler.start();
}
以及日志:
- 我的工作时间是2011年11月1日23:19:26.000,每2秒
- 我的工作时间是2011年11月1日23:19:27.000,每3秒
- 我的工作时间是2011年11月1日23:19:28.000,每2秒
- 我在01.11.2013T23:19:30.000的工作时间每2秒
- 我在01.11.2013T23:19:30.001的工作时间每3秒
- 我的工作时间是01.11.2013T23:19:32.000每2秒
- 我的工作时间是2011年11月1日23:19:33.000,每3秒
- 我的工作时间是2011年11月1日23:19:34.000,每2秒
- 我在01.11.2013T23:19:36.000的工作时间每2秒
- 我在01.11.2013T23:19:36.001的工作每3秒
- 我的工作时间是2011年11月1日23:19:38.000,每2秒
- 我的工作时间是2011年11月1日23:19:39.000,每3秒
- 我的工作时间是01.11.2013T23:19:40.000每2秒
- 我在01.11.2013T23:19:42.001的工作每2秒
- 我在01.11.2013T23:19:42.002的工作时间每3秒
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) {
}
});
看起来它是有效的:
- 我的工作时间是2011年11月1日23:46:14.000,每2秒
- 我的工作时间是2011年11月1日23:46:15.000,每3秒
- 我的工作时间是2011年11月1日23:46:16.000,每2秒
- 我的工作时间是2011年11月1日23:46:18.000,每2秒
- --->应该开火但跳过-我的工作时间是2013T23:01.11:46:18.000,每3秒一次
- 我的工作时间是2011年11月1日23:46:20.000,每2秒
- 我的工作时间是01.11.2013T23:46:21.000,每3秒
- 我的工作时间是2011年11月1日23:46:22.000,每2秒
- 我的工作时间是2011年11月1日23:46:24.000,每2秒
- --->应该开火,但跳过-我的工作时间为01.11.2013T23:46:24.000,每3秒
- 我的工作时间是2011年11月1日23:46:26.000,每2秒
- 我的工作时间是2011年11月1日23:46:27.000,每3秒
- 这是阻止作业运行的有用答案。除了防止从不调用重复作业之外,在实现作业的类上使用注释@DisallowConcurrentExecution