springboot整合quartz

2018.6.26

通过老大提点,在springBoot2.0之后版本中,已将quartz框架进行自动配置,无需再自定义job工厂自自动装配bean。如下内容仅适用于springBoot2.0以前版本。java

背景

在springboot中使用quartz框架进行调度任务,可是quartz本身来管理job,故spring没法为job注入bean,现对quartz进行改造,让spring来管理job,使之可以实现注入spring

boot框架版本

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

改造过程

1.自定义本身的job工厂,在自定义工厂里面,为job注入相应的bean

@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;
    }
}

2.对springboot进行配置

@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();
    }
}

2.使用示例

@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);
    }


}
相关文章
相关标签/搜索