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


}
相關文章
相關標籤/搜索