У меня есть эта конфигурация 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?
Основная концепция планирования нескольких рабочих мест:
Ниже приведен пример с двумя заданиями:
@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
Я думаю, что то, что вы ищете, объясняется в примере здесь hackernoon.com/how-to-schedule-jobs-with-quartz-in-spring-boot