重启服务器时如何处理Quartz简单触发器

时间:2015-03-03 06:24:19

标签: java quartz-scheduler

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

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

2 个答案:

答案 0 :(得分: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()政策的更多信息,请再次阅读<{> Tomasz Nurkiewicz

答案 1 :(得分:0)

来自Quartz doc

  

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

因此,您必须切换到JDBCJobStore。