Spring Boot: Verwenden eines @Service bei der Ausführung von Quarz-Jobs

In einer Anwendung habe ich das Problem, dass die auf Quartz basierenden geplanten Jobs nicht mehr funktionieren, da ich sie von einer klassischen Spring-Webanwendung (bereitgestellt in einem Tomcat-System) in eine Spring-Boot-Anwendung (V1.2.1) konvertiert habe.

Ich plane diese Quartz-Jobs wie folgt:

// 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 ist ein klassischer Frühlingsdienst, der Daten aus dem Ruhezustand abruft. Wie ich bereits sagte, funktionierte dies einwandfrei, bis ich zu Spring Boot wechselte.

Wenn ich diesen Code mit der klassischen Spring-Anwendung implementiert habe,SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); hat den Trick gemacht, sich um die automatische Verdrahtung des Dienstes zu kümmern.

Was wird benötigt, um diese Funktion in der Spring Boot-Umgebung wiederherzustellen?

Bearbeiten

Am Ende entschied ich mich, Quarz nicht mehr zu Gunsten von Spring's ThreadPoolTaskScheduler zu verwenden. Der Code wurde stark vereinfacht und funktioniert wie erwartet.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage