今天想单元测试一下spring中的quartz定时任务,job类的大致结构和下面的SpringQtz1类相似,我的是实现的org.quartz.Job接口,到最后总是发现job类里注入的service为null。一开始还以为spring的配置问题,各种找原因,最后还是确定是没有注入的原因。
就去网上搜搜吧。也找出来一些眉目。简单的理解这个原因是job是在quartz中实例化出来的,不受spring的管理。所以就导致注入不进去了。参考这个文章
找着试试的态度,就按照文章里说的。new一个类
public class MyJobFactory extendsAdaptableJobFactory {//这个对象Spring会帮我们自动注入进来,也属于Spring技术范畴.
@AutowiredprivateAutowireCapableBeanFactory capableBeanFactory;protected Object createJobInstance(TriggerFiredBundle bundle) throwsException {//调用父类的方法
Object jobInstance = super.createJobInstance(bundle);//进行注入,这属于Spring的技术,不清楚的可以查看Spring的API.
capableBeanFactory.autowireBean(jobInstance);returnjobInstance;
}
}
接下来把他配置到Spring当中去
然后在把org.springframework.scheduling.quartz.SchedulerFactoryBean的jobFactory设置成我们自己的。
这样就ok了。
问题算是解决了吧,但是想着还要自己写一个类,还要配置到其它地方,感觉破坏了quartz的完整性,事情不应该是这样子的。就试着找找其它方法。
正好前几天写spring和quartz的例子的时候,一个文章介绍了spring下quartz定时任务的两种方式。博文地址http://kevin19900306.iteye.com/blog/1397744
一个是继承QuartzJobBean,另一个不用继承,单纯的java类。我想QuartzJobBean是spring里的类,这样的话这个方式的定时任务类是否就是spring来管理的。注入应该就没问题了吧。
这是一个很小的项目,实验起来也很简单,就启动,debug。发现还是注入不进去。就接着试第二种方式,debug。惊奇的发现注入没问题了。
到此为止,这个问题已经解决了。当然还是最后一种方式合理简单。
--------------------------------------------------------------------------------------------------------------------------------
Junit的加入
如果再加上Junit的话,情况可能会再复杂一点。有一个现象就是你如果运行了测试方法,就是你可能看不到定时任务运行。在进行任务类里打断点,也可能不起作用,原因就是junit是另一个单独的线程,
这个线程结