我是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/

10-08 23:27