애플리케이션에서, 스프링 애플 리케이션 (Spring Tomcat)을 Spring Boot (V1.2.1) 응용 프로그램으로 변환 한 이후로, 쿼츠 기반 예약 작업이 더 이상 작동하지 않습니다.스프링 부트 : Quartz 작업 실행에서 @Service 사용하기
나는 다음과 같이 이러한 석영 작업을 예약 :
// 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
최대 절전 모드에서 데이터를 가져 오는 고전적인 봄 서비스입니다. 위에서 말했듯이 스프링 부트로 이동할 때까지는 제대로 작동합니다.
클래식 코드로이 코드를 구현 한 경우 SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
은 서비스 자동 응답을 처리하기 위해이 트릭을 사용했습니다.
스프링 부트 환경에서이 기능을 다시 사용하려면 무엇이 필요합니까?
편집 : 나는 봄의 ThreadPoolTaskScheduler.The 코드에 찬성 석영을 사용하여 멀리 이동하기로 결정했습니다 끝에
훨씬 단순화했고 예상대로 작동합니다.
코멘트
public
(!) 방법에 다음과 같은 주석을 배치 그 후을 배치 간단하여 스케줄러를 사용하는 응용 프로그램을 구성 할 수 있습니다 Spring.Boot을 사용하여 Dewfy (주석을 달 수있는 담당자가 충분하지 않기 때문에) : 최대 절전 모드 세션이 연결되지 않았다는 오류가있어서 @Transactional 주석으로 메서드를 표시해야했습니다. – gooboo