gpt4 book ai didi

java - quartz : skipping duplicate job fires scheduled with same fire time

转载 作者:行者123 更新时间:2023-11-30 08:29:05 29 4
gpt4 key购买 nike

我是 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();

}

和日志:

  • 我的工作在 01.11.2013T23:19:26.000 每 2 秒
  • 我的工作在 01.11.2013T23:19:27.000 每 3 秒
  • 我的工作在 01.11.2013T23: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 秒
  • 我的工作在 01.11.2013T23:19:33.000 每 3 秒
  • 我的工作在 01.11.2013T23:19:34.000 每 2 秒
  • 我的工作在 01.11.2013T23:19:36.000 每 2 秒
  • 我的工作在 01.11.2013T23:19:36.001 每 3 秒
  • 我的工作在 01.11.2013T23:19:38.000 每 2 秒
  • 我的工作在 01.11.2013T23: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) {
}
});

看起来有效:

  • 我的工作在 01.11.2013T23:46:14.000 每 2 秒
  • 我的工作在 01.11.2013T23:46:15.000 每 3 秒
  • 我的工作在 01.11.2013T23:46:16.000 每 2 秒
  • 我的工作在 01.11.2013T23:46:18.000 每 2 秒
  • ---> 应该触发但被跳过 - 我的工作在 01.11.2013T23:46:18.000 每 3 秒一次
  • 我的工作在 01.11.2013T23:46:20.000 每 2 秒一次
  • 我的工作在 01.11.2013T23:46:21.000 每 3 秒
  • 我的工作在 01.11.2013T23:46:22.000 每 2 秒
  • 我的工作在 01.11.2013T23:46:24.000 每 2 秒
  • ---> 应该触发但被跳过 - 我的工作在 01.11.2013T23:46:24.000 每 3 秒一次
  • 我的工作在 01.11.2013T23:46:26.000 每 2 秒
  • 我的工作在 01.11.2013T23:46:27.000 每 3 秒

关于java - quartz : skipping duplicate job fires scheduled with same fire time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19733981/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com