在使用Quartz的时候遇到一个问题:
原因:
当前使用的是Spring-Quartz,xml配置,但是Job太多,导致很多的xml配置
目的:
不使用spring-quartz的配置,单独使用quartz,因为Job太多,配置文件太臃肿,而且尽量不去更改现有的Job代码,因为Job太多,更改难免会出现问题。
因为现有的Job中有很多Spring的属性依赖,不打算放到JobExecutionContext中,还要再取出来
问题:
原来的Job是Spring自动扫描的,属性可以自动注入,现在换成使用单独的Quartz,属性不能注入了(具体原因没有细看)
解决方法:
方法1:
网上查找到的方法是 一个类继承 AdaptableJobFactory
当前版本的Quartz 2.1.7的Scheduler中有一个方法 setJobFactory
然后,如下
public class JobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
//调用父类的方法
Object jobInstance = super.createJobInstance(bundle);
//进行注入
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
再去看原来Job中的属性,已经被注入了。
方法2:
public class ApplicationContextHolder implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@SuppressWarnings("all")
public void setApplicationContext(ApplicationContext context) throws BeansException {
if(this.applicationContext != null) {
throw new IllegalStateException("ApplicationContextHolder already holded 'applicationContext'.");
}
this.applicationContext = context;
}
public static ApplicationContext getApplicationContext() {
if(applicationContext == null)
throw new IllegalStateException("'applicationContext' property is null,ApplicationContextHolder not yet init.");
return applicationContext;
}
public static Object getBean(Class<?> clazz) {
return null == applicationContext ? null : applicationContext.getBean(clazz);
}
public static Object getBean(String beanName) {
return getApplicationContext().getBean(beanName);
}
public static void cleanHolder() {
applicationContext = null;
}
}
使用方法
在Job中使用 ApplicationContextHolder.getBean() 赋值给原来需要注入的属性。
推荐使用方法1 ,没有侵入性,而且需要更改的代码量最少。