Добавьте много классов Java в качестве заданий Quartz

У меня есть эта конфигурация Quartz, которую я использую для запуска одного задания:

@Configuration
public class SchedulerConfig {

    private static final Logger LOG = LoggerFactory.getLogger(SchedulerConfig.class);

    private ApplicationContext applicationContext;

    @Autowired
    public SchedulerConfig(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    @Bean
    public JobFactory jobFactory() {
        AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
        jobFactory.setApplicationContext(applicationContext);
        return jobFactory;
    }

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(Trigger simpleJobTrigger) throws IOException {

        SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
        schedulerFactory.setQuartzProperties(quartzProperties());
        schedulerFactory.setWaitForJobsToCompleteOnShutdown(true);
        schedulerFactory.setAutoStartup(true);
        schedulerFactory.setTriggers(simpleJobTrigger);
        schedulerFactory.setJobFactory(jobFactory());
        return schedulerFactory;
    }

    @Bean
    public SimpleTriggerFactoryBean simpleJobTrigger(@Qualifier("keywordPostJobDetail") JobDetail jobDetail,
                                                     @Value("${simplejob.frequency}") long frequency) {
        LOG.info("simpleJobTrigger");

        SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
        factoryBean.setJobDetail(jobDetail);
        factoryBean.setStartDelay(0L);
        factoryBean.setRepeatInterval(frequency);
        factoryBean.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY); // factoryBean.setRepeatCount(0); //
        return factoryBean;
    }

    @Bean
    public JobDetailFactoryBean keywordPostJobDetail() {
        JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
        // Add here more Java Classes
        factoryBean.setJobClass(DomainOrgCheckJob.class);
        factoryBean.setDurability(true);
        return factoryBean;
    }

    public Properties quartzProperties() throws IOException {
        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
        propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
        propertiesFactoryBean.afterPropertiesSet();
        return propertiesFactoryBean.getObject();
    }
}

Как я могу добавить больше классов Java, которые могут выполняться в качестве второго или нескольких заданий? Нужно ли добавлять больше @Bean-s?

Я думаю, что то, что вы ищете, объясняется в примере здесь hackernoon.com/how-to-schedule-jobs-with-quartz-in-spring-bo‌​ot

Prateek Jain 27.11.2022 12:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
106
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основная концепция планирования нескольких рабочих мест:

  1. Нам нужно создать несколько классов Job.
  2. Затем передайте классы Job в JobDetails, чтобы создать индивидуальный JobDetailFactoryBean.
  3. После этого создайте триггер(ы) для запуска JobDetails, используя SimpleTriggerFactoryBean.
  4. Наконец, отправьте все JobDetails в планировщике вместе с триггеры для запуска заданий по расписанию.

Ниже приведен пример с двумя заданиями:

@Bean
public SchedulerFactoryBean schedulerFactoryBean(List<JobDetail> jobDetails,
                                      List<Trigger> triggers) {

    SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
    schedulerFactory.setConfigLocation(new ClassPathResource("quartz.properties"));

    LOGGER.debug("Setting the jobs Scheduler up");
    schedulerFactory.setJobFactory(jobFactory());
    schedulerFactory.setWaitForJobsToCompleteOnShutdown(true);
    schedulerFactory.setAutoStartup(true);
    //Multiple jobs are passed as an array
    schedulerFactory.setJobDetails(jobDetails.toArray(JobDetail[] ::new));
    //Multiple triggers are passed as an array
    schedulerFactory.setTriggers(triggers.toArray(Trigger[] ::new));
    return schedulerFactory;
}


@Bean(name = "FirstJob")
public JobDetailFactoryBean firstJob() {

    JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
    jobDetailFactory.setJobClass(FirstDomainOrgCheckJob.class);
    jobDetailFactory.setDurability(true);
    return jobDetailFactory;
}

@Bean
public SimpleTriggerFactoryBean firstJobTrigger(@Qualifier("FirstJob") JobDetail job,
                                                @Value("${first.job.frequency}") long frequency) {

    LOGGER.info("First Job Trigger");

    SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
    factoryBean.setJobDetail(job);
    factoryBean.setStartDelay(0L);
    factoryBean.setRepeatInterval(frequency);
    factoryBean.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
    return factoryBean;
}

@Bean(name = "SecondJob")
public JobDetailFactoryBean secondJob() {

    JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
    jobDetailFactory.setJobClass(SecondDomainOrgCheckJob.class);
    jobDetailFactory.setDurability(true);
    return jobDetailFactory;
}

@Bean
public SimpleTriggerFactoryBean secondJobTrigger(@Qualifier("SecondJob") JobDetail job,
                                                 @Value("${second.job.frequency}") long frequency) {

    LOGGER.info("Second Job Trigger");

    SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
    factoryBean.setJobDetail(job);
    factoryBean.setStartDelay(0L);
    factoryBean.setRepeatInterval(frequency);
    factoryBean.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
    return factoryBean;
}

Журналы

FirstDomainOrgCheckJob   : FirstJob fired at Sun Nov 27 12:43:33 UTC 2022
SecondDomainOrgCheckJob  : SecondJob fired at Sun Nov 27 12:43:33 UTC 2022

Другие вопросы по теме