技巧分享-18周-Spring boot整合Quartz解决Bean注入问题

问题:Quartz调用定时任务,使用对象不是通过Spring容器生成。定时任务里面存在Bean需要注入就报NullPointException错误。代码如下:

@Component
public class ProdClearTaskEntrance extends ClearTaskEntrance implements Job  {

    /**
     * 数据库
     */
    @Autowired
    private Dbop dbop;

}

调用dbop就会报出NullPointException错误

方案:修改该问题就需要将对象创建由Spring容器来完成。
设置Spring容器完成对象生成

@Component
public class MyJobFactory extends AdaptableJobFactory {

    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;

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

设置定时调用对象Scheduler

@Configuration
public class QuartzConfig {

    private JobFactory jobFactory;

    public QuartzConfig(JobFactory jobFactory){
        this.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(name = "scheduler")
    public Scheduler scheduler() {
        return schedulerFactoryBean().getScheduler();
    }
}

使用定时任务直接注入Scheduler即可

    /**
     * 定时任务工厂
     */
    @Autowired
    private Scheduler scheduler;

你可能感兴趣的:(技巧分享-18周-Spring boot整合Quartz解决Bean注入问题)