概述
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工程,这时候就没问题了。
最后
以上就是坚强大碗为你收集整理的springBoot整合Quartz注入的业务service为空的全部内容,希望文章能够帮你解决springBoot整合Quartz注入的业务service为空所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复