springBoot整合Quartz注入的业务service为空

springBoot整合Quartz过程在下一篇博客。

问题描述:

springBoot整合Quartz后,job中注入的业务service为null。

原因:

Spring容器可以管理Bean,但是Quartz的job是自己管理的,如果在Job中注入Spring管理的Bean,需要先把Quartz的Job也让Spring管理起来,因此,我们需要重写JobFactory。

解决方法:

创建任务工厂:

@Component
public class MyJobFactory extends AdaptableJobFactory {

    private final AutowireCapableBeanFactory capableBeanFactory;

    public MyJobFactory(AutowireCapableBeanFactory capableBeanFactory) {
        this.capableBeanFactory = capableBeanFactory;
    }

    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        // 调用父类的方法
        Object jobInstance = super.createJobInstance(bundle);
        // 进行注入
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}

将一个方法产生为Bean并交给Spring容器管理。
Spring为了能集成Quartz,特意提供了管理Quartz的schedulerFactoryBean,必须配置

@Configuration
public class StartSchedulerListener implements ApplicationListener<ContextRefreshedEvent> {


    @Autowired
    public MySchedulerFactory mySchedulerFactory;

    private final MyJobFactory myJobFactory;

    public StartSchedulerListener(MyJobFactory myJobFactory) {
        this.myJobFactory = myJobFactory;
    }

    // springboot 启动监听
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        try {
            mySchedulerFactory.scheduleJobs();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    //注入SchedulerFactoryBean
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean() {
    	// Spring提供SchedulerFactoryBean为Scheduler提供配置信息,并被Spring容器管理其生命周期
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        schedulerFactoryBean.setStartupDelay(5);//延时5秒启动
        // 设置自定义Job Factory,用于Spring管理Job bean
        schedulerFactoryBean.setJobFactory(myJobFactory);
        return schedulerFactoryBean;
    }

    @Bean(name = "scheduler")
    public Scheduler scheduler() {
        return schedulerFactoryBean().getScheduler();
    }

}

配置如上两个类,重新启动springboot工程,这时候就没问题了。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页