Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Quartz:跳过计划在相同启动时间进行的重复作业启动_Java_Quartz Scheduler - Fatal编程技术网

Java Quartz:跳过计划在相同启动时间进行的重复作业启动

Java Quartz:跳过计划在相同启动时间进行的重复作业启动,java,quartz-scheduler,Java,Quartz Scheduler,我是石英的新手,一直在重复作业。 它们是由两个触发点引起的,触发时间重叠 是否有任何Quartz“开箱即用”功能可以防止同一个作业的多个附加触发器重复触发 或者可能有第三方触发器实现,允许将计划与适当的消防时间计算相结合,以防止重复消防时间 或者我可以把多个时间表结合起来 任何解决方案都将不胜感激 谢谢 为了清楚起见: public static class MyJob implements Job { @Override public void execute(JobExecu

我是石英的新手,一直在重复作业。 它们是由两个触发点引起的,触发时间重叠

是否有任何Quartz“开箱即用”功能可以防止同一个作业的多个附加触发器重复触发

或者可能有第三方
触发器
实现,允许将计划与适当的消防时间计算相结合,以防止重复消防时间

或者我可以把多个时间表结合起来

任何解决方案都将不胜感激

谢谢

为了清楚起见:

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