通过老大提点,在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); } }