In un'applicazione, dal momento che l'ho convertita da una classica webapp di Spring (distribuita in un sistema Tomcat) a un'applicazione Spring Boot (V1.2.1), devo affrontare il problema I lavori programmati al quarzo non funzionano più.Spring Boot: utilizzo di un servizio @Service in Quartz
ho pianificare questi lavori al quarzo in questo modo:
// 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
è un servizio Primavera classico, che recupera i dati da Hibernate. Come ho detto sopra, questo ha funzionato bene fino a quando non mi sono trasferito a Spring Boot.
Quando ho implementato questo codice con la classica applicazione Spring, SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
ha fatto il trucco per occuparsi dell'autowiring del servizio.
Cosa è necessario per eseguire nuovamente questo lavoro nell'ambiente Spring Boot?
Edit:
Alla fine ho scelto di allontanarsi da utilizzando Quarzo a favore del codice ThreadPoolTaskScheduler.The di primavera era molto semplificata e funziona come previsto.
Commento di rispondere da Dewfy (dal momento che non ho abbastanza rep per commentare): Ho anche dovuto contrassegnare il metodo con l'annotazione @Transactional, poiché ho ricevuto l'errore che la sessione di sospensione non era collegata. – gooboo