Spring Boot: использование @Service в выполнении задания Quartz
В приложении, поскольку я преобразовал его из классического веб-приложения Spring (развернутого в системе Tomcat) в приложение Spring Boot (V1.2.1), я столкнулся с проблемой того, что запланированные задания на основе Quartz больше не работают.
Я планирую эти кварцевые работы следующим образом:
// My own Schedule object which holds data about what to schedule when
Schedule schedule = scheduleService.get(id of the schedule);
String scheduleId = schedule.getId();
JobKey jobKey = new JobKey(scheduleId);
TriggerKey triggerKey = new TriggerKey(scheduleId);
JobDataMap jobData = new JobDataMap();
jobData.put("scheduleId", scheduleId);
JobBuilder jobBuilder = JobBuilder.newJob(ScheduledActionRunner.class)
.withIdentity(jobKey)
.withDescription(schedule.getName())
.usingJobData(jobData);
JobDetail job = jobBuilder.build();
TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger()
.forJob(jobKey)
.withIdentity(triggerKey)
.withDescription(schedule.getName());
triggerBuilder = triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(schedule.toCronExpression()));
Trigger trigger = triggerBuilder.build();
org.quartz.Scheduler scheduler = schedulerFactoryBean.getScheduler();
scheduler.scheduleJob(job, trigger);
ScheduledActionRunner
:
@Component
public class ScheduledActionRunner extends QuartzJobBean {
@Autowired
private ScheduleService scheduleService;
public ScheduledActionRunner() {
}
@Override
public void executeInternal(final JobExecutionContext context) throws JobExecutionException {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
final JobDataMap jobDataMap = context.getMergedJobDataMap();
final String scheduleId = jobDataMap.getString("scheduleId");
final Schedule schedule = scheduleService.get(scheduleId);
// here it goes BANG since scheduleService is null
}
}
ScheduleService
это классический сервис Spring, который получает данные из Hibernate. Как я уже говорил выше, это работало нормально, пока я не перешел в Spring Boot.
Когда я реализовал этот код с классическим приложением Spring,SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
сделал трюк, чтобы позаботиться об автосервисе сервиса.
Что нужно для того, чтобы эта работа снова заработала в среде Spring Boot?
Редактировать:
В конце я решил отказаться от использования Quartz в пользу Spring ThreadPoolTaskScheduler. Код был значительно упрощен, и он работает, как и ожидалось.