我在Spring MVC中使用带有RAMJobStore的Quartz简单触发器进行调度。它运行正常,直到服务器运行。当我停止服务器并重新运行程序时,以前安排的作业没有运行。
方案:
最初我安排工作分别在下午1点和下午1点半运行。第一份工作(下午1点)成功执行,在1:15我停止服务器并重新启动它。但是1:30的工作没有被执行。
答案 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)