Создан простой источник приложения для весенней загрузки. Целью приложения является динамическое создание задания и запуск его с помощью триггера.
Я пытаюсь использовать выражение cron, но оно не работает.
Но простой триггер для запуска через 30 секунд, это работает.
Любой может помочь мне здесь с тем, что не так с источником приложения. Выложили копию в общедоступный репозиторий GitHub. Вы можете клонировать, нажав здесь.
Шаги по воспроизведению проблемы в файле readme, прикрепленном к исходному коду.
приложение.свойства
spring.quartz.job-store-type=memory
spring.quartz.properties.org.quartz.threadPool.threadCount=5
# logging level
#logging.level.org.springframework=ERROR
logging.level.com.example=DEBUG
logging.level.org.quartz=DEBUG
# output to a file
logging.file=app.log
# temp folder example
#logging.file=${java.io.tmpdir}/app.log
logging.pattern.file=%d %p %c{1.} [%t] %m%n
logging.pattern.console=%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
Рестконтроллер
package com.example.QuartzREST;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/api", produces = "application/hal+json")
public class QuartzRestResource {
@Autowired private QartzRestService qartzRestService;
@SneakyThrows
@GetMapping("/schedule/cron/job/{id}")
public String scheduleCronJob(@PathVariable("id") String id) {
qartzRestService.scheduleJobWithCronTrigger(id,"0/5 0 0 ? * * *");
return "OK";
}
@SneakyThrows
@GetMapping("/schedule/simple/job/{id}")
public String scheduleSimpleJob(@PathVariable("id") String id) {
qartzRestService.scheduleJobWithSimpleTrigger(id);
return "OK";
}
}
QartzRestService
package com.example.QuartzREST;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.Instant;
import java.util.Date;
/**
* @author Ameya Shetti
*/
@Slf4j
@Service
public class QartzRestService {
@Autowired private Scheduler scheduler;
public void scheduleJobWithCronTrigger(String jobId, String cronExpresson) throws SchedulerException {
JobDetail jobDetail = this.buildJobDetail(jobId);
scheduler.scheduleJob(jobDetail,buildJobCronTrigger(jobId,jobDetail,cronExpresson));
scheduler.start();
}
public void scheduleJobWithSimpleTrigger(String jobId) throws SchedulerException {
JobDetail jobDetail = this.buildJobDetail(jobId);
scheduler.scheduleJob(jobDetail,buildJobSimpleTrigger(jobId,jobDetail));
scheduler.start();
}
private JobDetail buildJobDetail(String jobId) {
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put(QartzRestConstants.KEY_JOB_ID, jobId);
return JobBuilder.newJob(QartzRestJob.class)
.withIdentity(QartzRestConstants.BATCHJOB+jobId, QartzRestConstants.GROUP1)
.usingJobData(jobDataMap)
.storeDurably()
.build();
}
private Trigger buildJobSimpleTrigger(String jobId, JobDetail jobDetail) {
return TriggerBuilder.newTrigger()
.withIdentity(QartzRestConstants.BATCH_TRIGGER+jobId, QartzRestConstants.GROUP1)
.forJob(jobDetail)
.startAt(Date.from(Instant.now().plusSeconds(30)))
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withMisfireHandlingInstructionFireNow())
.build();
}
private Trigger buildJobCronTrigger(String jobId, JobDetail jobDetail, String cronExpression) {
log.debug("cron expression used : {}",cronExpression);
return TriggerBuilder.newTrigger()
.withIdentity(QartzRestConstants.BATCH_TRIGGER+jobId, QartzRestConstants.GROUP1)
.forJob(jobDetail)
.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
.build();
}
}