技巧分享-18周-Spring boot整合Quartz解決Bean注入問題

問題:Quartz調(diào)用定時任務(wù),使用對象不是通過Spring容器生成。定時任務(wù)里面存在Bean需要注入就報NullPointException錯誤。代碼如下:

@Component
public class ProdClearTaskEntrance extends ClearTaskEntrance implements Job  {

    /**
     * 數(shù)據(jù)庫
     */
    @Autowired
    private Dbop dbop;

}

調(diào)用dbop就會報出NullPointException錯誤

方案:修改該問題就需要將對象創(chuàng)建由Spring容器來完成。
設(shè)置Spring容器完成對象生成

@Component
public class MyJobFactory extends AdaptableJobFactory {

    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;

    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        // 調(diào)用父類的方法
        Object jobInstance = super.createJobInstance(bundle);
        // 進行注入
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}

設(shè)置定時調(diào)用對象Scheduler

@Configuration
public class QuartzConfig {

    private JobFactory jobFactory;

    public QuartzConfig(JobFactory jobFactory){
        this.jobFactory = jobFactory;
    }

    /**
     * 配置SchedulerFactoryBean
     *
     * 將一個方法產(chǎn)生為Bean并交給Spring容器管理
     */
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean() {
        // Spring提供SchedulerFactoryBean為Scheduler提供配置信息,并被Spring容器管理其生命周期
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        // 設(shè)置自定義Job Factory,用于Spring管理Job bean
        factory.setJobFactory(jobFactory);
        return factory;
    }

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

使用定時任務(wù)直接注入Scheduler即可

    /**
     * 定時任務(wù)工廠
     */
    @Autowired
    private Scheduler scheduler;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容