問題: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;