Bir uygulamada, onu klasik bir Spring webapp'dan (bir Tomcat sisteminde konuşlandırıldı) bir Spring Boot (V1.2.1) uygulamasına dönüştürdüğümden beri, Kuvars tabanlı planlanmış işler artık çalışmıyor.Spring Boot: Quartz iş uygulamasında @Service kullanma
böyle bu Kuvars işleri planlamak:
// 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
hazırda veri getirir klasik Bahar hizmetidir. Yukarıda belirttiğim gibi, Spring Boot'a taşınana kadar bu işe yaradı.
Bu kodu klasik Yay uygulamasıyla uyguladığımda, SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
hizmeti otomatik olarak halletmek için hile yaptı.
İlkbaharda önyükleme ortamında bu işi yeniden yapmak için ne gerekir?
Düzenleme: Bahar 'ThreadPoolTaskScheduler.The kodunun lehine Kuvars kullanarak uzaklaşmaya seçti sonunda
çok basitleştirilmiş ve beklendiği gibi çalışır.
yorumun
public
(!) Yöntemine aşağıdaki şerhi Bundan sonrayerleştirerek basit tarafından zamanlayıcı kullanmak üzere yapılandırabilirsiniz Spring.Boot sen kullanma Dewfy (yorum yapmak için yeterli reporuma sahip olmadığımdan): @Transactional ek açıklama ile yöntemi işaretlemem gerekiyordu, çünkü hazırda bekletme oturumu eklenemedi. – gooboo