Динамическое планирование заданий при весенней загрузке с кварцевым планировщиком - PullRequest
0 голосов
/ 25 марта 2019

Я хочу планировать задания динамически на основе конфигурации расписания, предоставленной пользователем из пользовательского интерфейса. Когда пользователь сохраняет новую конфигурацию расписания из пользовательского интерфейса, процесс должен вызывать новое задание с новыми запланированными параметрами. Для выполнения одной и той же работы может быть n конфигураций. Spring поддерживает реализацию сведений о задании и запускает следующим образом.

Определение детализации работы:

@Bean
public JobDetail jobDetail() {
    return JobBuilder.newJob().ofType(SampleJob.class)
      .storeDurably()
      .withIdentity("Qrtz_Job_Detail")  
      .withDescription("Invoke Sample Job service...")
      .build();
}

Определение триггера:

@Bean
public Trigger trigger(JobDetail job) {
    return TriggerBuilder.newTrigger().forJob(job)
      .withIdentity("Qrtz_Trigger")
      .withDescription("Sample trigger")
      .withSchedule(simpleSchedule().repeatForever().withIntervalInHours(1))
      .build();
}

Как я могу передать параметры для детализации задания и выполнить динамический запуск на основе параметров, предоставленных пользователем?

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Самый простой способ - выполнить настройку, расширив метод SpringBeanJobFactory и @Override createJobInstance . Затем вам нужно определить SchedulerFactoryBean и, наконец, ваш Планировщик :

@Configuration
public class SchedulerConfiguration {

    public class AutowireCapableBeanJobFactory extends SpringBeanJobFactory {

        private final AutowireCapableBeanFactory beanFactory;

        @Autowired
        public AutowireCapableBeanJobFactory(AutowireCapableBeanFactory beanFactory) {
            Assert.notNull(beanFactory, "Bean factory must not be null");
            this.beanFactory = beanFactory;
        }

        @Override
        protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
            Object jobInstance = super.createJobInstance(bundle);
            this.beanFactory.autowireBean(jobInstance);
            this.beanFactory.initializeBean(jobInstance, null);
            return jobInstance;
        }
    }

    @Bean
    public SchedulerFactoryBean schedulerFactory(ApplicationContext applicationContext) {
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        schedulerFactoryBean.setJobFactory(new AutowireCapableBeanJobFactory(applicationContext.getAutowireCapableBeanFactory()));
        return schedulerFactoryBean;
    }

    @Bean
    public Scheduler scheduler(ApplicationContext applicationContext) throws SchedulerException {
        Scheduler scheduler = schedulerFactory(applicationContext).getScheduler();
        scheduler.start();
        return scheduler;
    }
}

Затем в любом месте вашего приложения, например, в RestController, вы можете получить доступ к планировщику и запланировать новое задание:

@RestController
public class ScheduleController {

    @Autowired
    private Scheduler scheduler;

    @GetMapping(value = "/schedule/{detail}/{desc}")
    public String scheduleJob(@PathVariable(value = "detail") String detail, @PathVariable(value = "desc") String desc) throws SchedulerException {
        JobDetail job = newJob(detail, desc);
        return scheduler.scheduleJob(job, trigger(job)).toString();
    }

    private JobDetail newJob(String identity, String description) {
        return JobBuilder.newJob().ofType(SimpleJob.class).storeDurably()
                .withIdentity(JobKey.jobKey(identity))
                .withDescription(description)
                .build();
    }

    private SimpleTrigger trigger(JobDetail jobDetail) {
        return TriggerBuilder.newTrigger().forJob(jobDetail)
                .withIdentity(jobDetail.getKey().getName(), jobDetail.getKey().getGroup())
                .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1))
                .build();
    }
}

Вы можете контролировать все расписания (пауза, остановка, перезапуск, удаление и т. Д.) Из своего Scheduler - просмотра документации

0 голосов
/ 26 марта 2019

Для этого предназначены параметры JobDataMap. Вы можете использовать эти параметры для передачи произвольных параметров в ваши задания и триггеры. Как правило, рекомендуется использовать значения параметров String, чтобы избежать различных проблем сериализации. API-интерфейс JobDataMap предоставляет вспомогательные методы, которые можно использовать для преобразования значений параметров JobDataMap со значениями строк в различные базовые объекты Java (Integer, Long, Double, Boolean и т. Д.).

Обратите внимание, что параметры JobDataMap, указанные на уровне JobDetail, могут быть переопределены на уровне Trigger. На уровне JobDetail вы обычно указываете общие параметры и / или значения по умолчанию, которые должны использоваться для всех выполнений задания, и вы переопределяете эти значения по умолчанию и / или добавляете новые параметры на уровне триггера.

Для получения подробной информации, пожалуйста, обратитесь к Кварцевый Javadoc:

JobBuilder.html # usingJobData

TriggerBuilder.html # usingJobData

JobDataMap.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...