W aplikacji, ponieważ przekonwertowałem ją z klasycznej wiosennej aplikacji webowej (wdrożonej w systemie Tomcat) do aplikacji Spring Boot (V1.2.1), napotykam problem, że Planowane prace kwarcowe już nie działają.Spring Boot: Używanie @Service w realizacji kwarcu
zaplanować te zadania Quartz tak:
// 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
to klasyczny serwis Wiosna, która pobiera dane z Hibernate. Jak wspomniałem powyżej, działało to dobrze, dopóki nie przeniosłem się do Spring Boot.
Kiedy zaimplementowałem ten kod za pomocą klasycznej aplikacji Spring, SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
podjął się pomocy przy autowirowaniu usługi.
Co jest potrzebne, aby ponownie zadziałało w środowisku Spring Boot?
Edit:
W końcu zdecydowałem się odejść od korzystania Quartz na rzecz kodu sprężyny ThreadPoolTaskScheduler.The był znacznie uproszczony i działa zgodnie z oczekiwaniami.
Komentarz do odpowiedzi z (!) Dewfy (ponieważ nie mam wystarczającej liczby osób do skomentowania): Musiałem również oznaczyć tę metodę adnotacją @Transactional, ponieważ dostałem błąd, że sesja hibernacji nie została dołączona. – gooboo