如何重新启动存储在数据库中的Quartz作业?

问题描述 投票:0回答:1

我有一个使用schedulerSpring Boot运行的Quartz应用程序。我创建了具有多个触发器(cron)的作业,该触发器运行得很好。作业的详细信息,cron表达式存储在数据库中。

这里是要求,每当重新启动应用程序时,存储的触发器就不会触发。我知道一种解决方法,可以实现它。存储作业的详细信息,在用户定义的表中触发。应在应用程序启动时预先加载。但是我不确定这种方法是对还是错。

此外,我还参考了许多文章和github项目,以了解如何重新启动/恢复/重新启动作业。

可能有一个我找不到的解决方案,可能是对石英或某些东西缺乏了解。我确信有人会经历这种情况并找到一种克服它的方法。如果有人提供答案将不胜感激。

java spring spring-boot quartz-scheduler
1个回答
0
投票

您可以使用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);
            }
        });
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.