通過老大提點,在springBoot2.0之後版本中,已將quartz框架進行自動配置,無需再自定義job工廠自自動裝配bean。如下內容僅適用於springBoot2.0以前版本。java
在springboot中使用quartz框架進行調度任務,可是quartz本身來管理job,故spring沒法爲job注入bean,現對quartz進行改造,讓spring來管理job,使之可以實現注入spring
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
@Component public class JobFactory extends AdaptableJobFactory { /** * AutowireCapableBeanFactory接口是BeanFactory的子類 * 能夠鏈接和填充那些生命週期不被Spring管理的已存在的bean實例 */ @Autowired private AutowireCapableBeanFactory capableBeanFactory; @Override protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { // 調用父類的方法 Object jobInstance = super.createJobInstance(bundle); // 進行注入 capableBeanFactory.autowireBean(jobInstance); return jobInstance; } }
@Configuration public class QuartzConfig { @Autowired private JobFactory jobFactory; /** * 配置SchedulerFactoryBean * * 將一個方法產生爲Bean並交給Spring容器管理 */ @Bean public SchedulerFactoryBean schedulerFactoryBean() { // Spring提供SchedulerFactoryBean爲Scheduler提供配置信息,並被Spring容器管理其生命週期 SchedulerFactoryBean factory = new SchedulerFactoryBean(); // 設置自定義Job Factory,用於Spring管理Job bean factory.setJobFactory(jobFactory); return factory; } @Bean public JobDetailImpl createJobDetailImpl() { return new JobDetailImpl(); } }
@Component public class ScheduleServiceImpl implements IScheduleService { public final static String BIZ_ID = "requestId"; @Qualifier("schedulerFactoryBean") @Autowired private Scheduler scheduler; @Override public Date scheduleAt(Date date, Class<? extends Job> job, String requestId) throws SchedulerException { JobDetail jobDetail = newJob(job) .withIdentity(requestId) .usingJobData(BIZ_ID, requestId) .build(); Trigger trigger = newTrigger() .withIdentity(requestId) .startAt(date) .withSchedule(simpleSchedule() .withIntervalInSeconds(20) .withRepeatCount(0)) .build(); return scheduler.scheduleJob(jobDetail, trigger); } }