问题: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;