【问题标题】:How to handle Quartz simple trigger when server is restarted服务器重启时如何处理Quartz简单触发器
【发布时间】:2018-06-24 20:06:54
【问题描述】:

我正在使用带有 RAMJobStore 的 Quartz 简单触发器在 Spring MVC 中进行调度。在服务器运行之前它工作正常。当我停止服务器并重新运行程序时,之前计划的作业没有运行。

场景:
最初我安排作业分别在下午 1 点和下午 1:30 运行。第一个作业(下午 1 点)成功执行,在 1:15 我停止了服务器并重新启动它。但是 1:30 的作业没有执行。

【问题讨论】:

  • 如何在 Scheduler 上调度 Job?提供一些细节..

标签: java quartz-scheduler


【解决方案1】:

我正在寻找类似问题的答案,并且能够通过Tomasz Nurkiewicz 的答案解决它,但这不是一个完整的解决方案。
考虑到您的情况,我在 freeformatter 的帮助下创建了一个 cron 表达式,因此您的代码应如下所示

try {
            Calendar cal = Calendar.getInstance();
            cal.set(Calendar.HOUR_OF_DAY, current_hour_of_day);
            cal.set(Calendar.MINUTE, 0);
            cal.set(Calendar.SECOND, 0);
            cal.set(Calendar.MILLISECOND, 0);
            Date date = cal.getTime();

            //Run's job after every 30mins starting from 1pm
            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0 0/30 13 ? * * *").inTimeZone(TimeZone.getDefault());
            JobKey jobKey = JobKey.jobKey("testing");
            JobDetail quartzJob = JobBuilder.newJob(SchedulerTask.class)
                    .withIdentity(jobKey).build();
            TriggerBuilder<Trigger> trigger = newTrigger();
            trigger.withIdentity("testing");
            trigger.withSchedule(cronScheduleBuilder
                     //It fires the scheduler once for n number of missed events
                    .withMisfireHandlingInstructionFireAndProceed());
            trigger.startAt(date);
            Trigger build = trigger.build();
            Scheduler quartzScheduler = new StdSchedulerFactory().getScheduler();
            quartzScheduler.start();
            quartzScheduler.scheduleJob(quartzJob, build);
        } catch (SchedulerException | ParseException ex) {
            Logger.getLogger(FeatureTesterMain.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }

Tomasz 的回答没有 trigger.startAt() 的部分,因此我错过的计划没有得到执行。
有关withMisfireHandlingInstructionFireAndProceed() 政策的更多信息,请再次阅读blog postTomasz Nurkiewicz

【讨论】:

  • 如他在问题中所述,如果是RAMJobStore,这将有何帮助?
  • 他必须将与调度程序相关的各个方面(即调度时间、最后调度的事件等)存储在数据库中或也可以存储在 RAM 中的文件中,这是常识.加上我提供的答案是RAMJobStore
  • 另外@yishaiz 你知道QTZ-283 问题
  • 1.如果他只使用 RAMJobStore,它将在他停止服务器时被删除。 2.如果他使用数据库或文件来存储它,那么它不再只在RAM中,他最好使用JDBCJobStore。 3. misfire 与此无关,因为在下午 1 点和 1:30 pm 服务器都已启动,因此没有出现失火的情况。
  • 无论如何,答案本身包含很好的信息,我只是不确定它是否回答了这个特定问题..
【解决方案2】:

来自石英doc

它将所有数据保存在 RAM 中......缺点是当您的应用程序结束(或崩溃)时,所有调度信息都会丢失

所以,你必须切换到 JDBCJobStore。

【讨论】:

  • 如果问题中提到的RAMJobStore@Kainix 将如何回答帮助?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多