Как перезапустить задания Quartz, которые хранятся в БД? - PullRequest
0 голосов
/ 06 января 2020

У меня есть приложение scheduler, которое работает с использованием Spring Boot & Quartz. Я создал работу с несколькими триггерами (cron), которая работает отлично. Детали задания, выражения cron хранятся в базе данных.

Это требование, при каждом перезапуске приложения хранимые триггеры не запускаются. Я знаю обходной путь, чтобы это произошло. Сохраняя детали задания, вызывайте в определенной пользователем таблице. Должен быть загружен заранее при каждом запуске приложения. Но я не уверен, что подход правильный или неправильный.

Также я сослался на множество статей и проектов github, чтобы узнать, как перезапустить / возобновить / повторно запустить задания.

Возможно, быть решением, где я не мог найти, может быть, отсутствие понимания кварца или что-то. Я уверен, что кто-то испытал бы сценарий и нашел способ преодолеть его. Буду благодарен, если кто-нибудь даст ответ.

1 Ответ

1 голос
/ 09 января 2020

Вы можете получить запланированные задания из базы данных и при запуске приложения, используя 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);
        }
    }
}

ИЛИ

@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);
            }
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...