当前位置: 首页 > 知识库问答 >
问题:

石英:跳过以相同的触发时间计划的重复作业触发

汤才捷
2023-03-14
html" target="_blank">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:0.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:40000的作业,每隔2秒
  • 我在01.11.2013T23:19:42.001的作业,每隔2秒
  • 我在01.11.2013t23:19:42.002的作业,每3秒

共有1个答案

井斌斌
2023-03-14

发现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秒
 类似资料:
  • 我们使用quartz调度器创建一个带有触发器名称和触发器组的触发器,它将在15分钟的间隔被触发。 我们希望在任何时间点手动触发时间表。因此,我们所做的就是获取与我们创建的计划相关联的作业的触发键细节,并尝试使用以下API触发作业。 用上面提到的API激发作业时(即尝试手动激发作业)的Quartz日志: 能不能有人请让我知道我们如何才能使时间表是触发与原来的工作相关联的触发器。

  • 我有一个Sprint Boot-Java8应用程序,它有一个quartz作业,我在启动时配置该作业并设置一个时间表。该作业按照计划自动运行,这与您对quartz作业的期望一样。然而,现在我希望能够允许用户通过点击前端上的一个按钮手动触发这些作业,而不会扰乱该作业的正常调度。这是我所有的相关档案。 但每次运行应用程序并点击控制器的方法时,都会在控制台中出现以下错误: 我到底做错了什么?如何使此作业按

  • 我正在使用一个使用Java的Quartz调度器。即使计划的时间已经过了,它也不会抛出调度器异常,而是现在运行作业。例如,我确认了一个作业是10月10日,今天是10月30日,如果我保存信息,它现在就运行作业本身 此外,我还使用JobListener实现手动触发一个作业,以便以后在同一时间点运行其他作业的情况下对其进行调度。 请帮忙。

  • 我有两个节点具有相同的Quartz调度器。JobStore具有作业的唯一触发器,它每5秒执行一次,处理该作业需要一秒。

  • 我知道这对terracotta的人来说是不公平的,但是有人尝试过使用Hazelcast在集群环境中使用计划作业吗? 我能想象到的最简单的实现是以下架构: 全局黑泽尔铸造锁,用于确保只有一台服务器启动了 Quartz 配置。 以分布式任务的形式运行实际任务。(这可以在以后完成,目前繁重的计划任务将需要处理触发分布式任务) 一旦持有锁的服务器关闭,另一台服务器就会获得锁。 我相信对于已经拥有Hazel

  • 我想用quartz scheduler使用jdbc数据存储立即执行作业~。然而,即使我使用now()或调用triggerjob进行调度,在调度和触发器fire之间也有20-30秒的延迟。 我尝试用一个简单的触发器执行作业: 并且我还尝试用调度程序触发: 下面是显示延迟的侦听器日志。