I'm new to Quartz and stuck on duplicate job runs. They was caused by two triggers which has overlapping fire times.
Is there any Quartz "out-of-the-box" functionality which will prevent duplicate fires of same job with multiple attached triggers?
Or maybe there is some third-party Trigger implementation which allows to combine schedule's with proper fire time calculation which will prevent duplicate fire times?
Or maybe i can somehow combine multiple schedules?
Any solution will be greatly appreciated.
Thanks
For the clarity:
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();
}
And the logs:
Found that TriggerListener's suitable for this task:
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) {
}
});
Looks like it works:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With