Я пытаюсь создать приложение, которое будет запускать два простых задания на основе cron с помощью spring-boot-starter-quartz.
Вот мой код:
application.yml - кварцевый конфиг
quartz:
job-store-type: jdbc
jdbc:
initialize-schema: never
properties:
org.quartz.scheduler.instanceName : instanceName
org.quartz.scheduler-factory.auto-startup : true
org.quartz.scheduler.instanceId : AUTO
org.quartz.threadPool.threadCount : 10
org.quartz.jobStore.driverDelegateClass : org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
org.quartz.jobStore.isClustered : true
Вот как я сделал свой триггер для запуска задания:
QuartzScheduler.java
@Value("${cloud.aws.queues.queueName}")
private String queueName;
@Autowired
private Scheduler scheduler;
@Override
public void schedule(JobDTO jobDTO) {
JobDetail job = JobBuilder.newJob()
.ofType(WriteToQueueQuartzJob.class)
.withIdentity("scheduleUnlockJob", "schedule")
.build();
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("queueName", queueName);
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("scheduleTrigger", "schedule")
.startNow()
.withSchedule(SimpleScheduleBuilder.repeatMinutelyForever())
.usingJobData(jobDataMap)
.build();
try {
scheduler.scheduleJob(job, trigger);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
Обычно я пытаюсь создать триггер, который будет вызывать задание для отправки в очередь. Поэтому я добавляю в JobData имя очереди удалений, и в моей работе я получаю следующее:
WriteToQueueQuartzJob.
@Setter
@NoArgsConstructor
public class WriteToQueueQuartzJob extends QuartzJobBean {
@Autowired
private QueueMessagingTemplate queueMessagingTemplate;
private String queueName;
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("job executed");
queueMessagingTemplate.convertAndSend(queueName, "test");
}
}
Логи, которые я получаю:
2018-10-31 10:27:00.612 INFO 17232 --- [ main] o.s.c.support.DefaultLifecycleProcessor : Starting beans in phase 0
2018-10-31 10:27:00.613 INFO 17232 --- [ main] o.s.i.endpoint.EventDrivenConsumer : Adding {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel
2018-10-31 10:27:00.613 INFO 17232 --- [ main] o.s.i.channel.PublishSubscribeChannel : Channel 'application-1.errorChannel' has 1 subscriber(s).
2018-10-31 10:27:00.613 INFO 17232 --- [ main] o.s.i.endpoint.EventDrivenConsumer : started _org.springframework.integration.errorLogger
2018-10-31 10:27:00.613 INFO 17232 --- [ main] o.s.c.support.DefaultLifecycleProcessor : Starting beans in phase 2147483647
2018-10-31 10:27:00.614 INFO 17232 --- [ main] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now
2018-10-31 10:27:00.629 INFO 17232 --- [ main] o.s.s.quartz.LocalDataSourceJobStore : ClusterManager: detected 1 failed or restarted instances.
2018-10-31 10:27:00.629 INFO 17232 --- [ main] o.s.s.quartz.LocalDataSourceJobStore : ClusterManager: Scanning for instance "CI000214961540974125118"'s failed in-progress jobs.
2018-10-31 10:27:00.638 INFO 17232 --- [ main] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_CI000214961540974411756 started.
2018-10-31 10:27:00.917 INFO 17232 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9020 (http) with context path ''
2018-10-31 10:27:00.933 INFO 17232 --- [ main] c.w.SchedulerMicroserviceApplication : Started SchedulerMicroserviceApplication in 27.471 seconds (JVM running for 30.915)
В основном я хочу, чтобы мое приложение автоматически вызывало планировщик для запуска заданий. Я создал фиктивный контроллер для ручного вызова метода планировщика, и все работает как положено, задания регистрируются в кварцевых таблицах, а сообщение поступает в очередь. Однако я не смог найти ничего, чтобы заставить его работать автоматически без вызова.