我有一个使用scheduler
和Spring Boot
运行的Quartz
应用程序。我创建了具有多个触发器(cron)的作业,该触发器运行得很好。作业的详细信息,cron表达式存储在数据库中。
这里是要求,每当重新启动应用程序时,存储的触发器就不会触发。我知道一种解决方法,可以实现它。存储作业的详细信息,在用户定义的表中触发。应在应用程序启动时预先加载。但是我不确定这种方法是对还是错。
此外,我还参考了许多文章和github项目,以了解如何重新启动/恢复/重新启动作业。
可能有一个我找不到的解决方案,可能是对石英或某些东西缺乏了解。我确信有人会经历这种情况并找到一种克服它的方法。如果有人提供答案将不胜感激。
您可以使用ApplicationRunner
或@EventListener(ApplicationReadyEvent.class)
从数据库和应用程序启动时获取计划作业,并调用startAllSchedulers()
。
public class SchedulerStartUpHandler implements ApplicationRunner {
@Autowired
private SchedulerService schedulerService;
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("Schedule all new scheduler jobs at app startup - starting");
try {
schedulerService.startAllSchedulers();
log.info("Schedule all new scheduler jobs at app startup - complete");
} catch (Exception ex) {
log.error("Schedule all new scheduler jobs at app startup - error", ex);
}
}
}
OR
@EventListener(ApplicationReadyEvent.class)
public void startTheScheduledJobFromDatabase() {
startAllSchedulers();
}
startAllSchedulers()
public void startAllSchedulers() {
List<SchedulerJobInfo> jobInfoList = schedulerRepository.findAll();
if (jobInfoList != null) {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
jobInfoList.forEach(jobInfo -> {
try {
JobDetail jobDetail = JobBuilder.newJob(SampleCronJob.class)
.withIdentity(jobInfo.getJobName(), jobInfo.getJobGroup()).build();
if (!scheduler.checkExists(jobDetail.getKey())) {
Trigger trigger;
jobDetail = scheduleCreator.createJob(SampleCronJob.class,
false, context, jobInfo.getJobName(), jobInfo.getJobGroup());
if (jobInfo.getCronJob() && CronExpression.isValidExpression(jobInfo.getCronExpression())) {
trigger = scheduleCreator.createCronTrigger(jobInfo.getJobName(), new Date(),
jobInfo.getCronExpression(), SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW);
} else {
trigger = scheduleCreator.createSimpleTrigger(jobInfo.getJobName(), new Date(),
jobInfo.getRepeatTime(), SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW);
}
scheduler.scheduleJob(jobDetail, trigger);
}
} catch (SchedulerException e) {
log.error(e.getMessage(), e);
}
});
}
}