在SpringMVC项目整合定时任务quart的时候,需要用到service,直接用@Resource 注入不了。
在网上参考了大量方法,试过了,用到
AdaptableJobFactory这个类。
自定义一个类:
public class JobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
// 调用父类的方法
Object jobInstance = super.createJobInstance(bundle);
System.out.println("capableBeanFactory----------" + capableBeanFactory);
// 进行注入
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
然后在spring中配置:
<!-- 定时任务的factorybean,配置其他config -->
<bean id="jobFactory" class="com.scm.util.common.JobFactory"></bean>
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="startQuertz" lazy-init="true" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobFactory" ref="jobFactory"/>
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
</bean>
这样配置,在自定义类JobFactory里面报错。
我打印出来的capableBeanFactory 是 null
capableBeanFactory----------null
16:06:10.031 [startQuertz_QuartzSchedulerThread] ERROR org.quartz.core.ErrorLogger - An error occured instantiating job to be executed. job= 'BL_MAT_INFO.BL_MAT_INFO'
org.quartz.SchedulerException:
Job instantiation failed
at org.springframework.scheduling.quartz.AdaptableJobFactory.newJob(AdaptableJobFactory.java:61) ~[spring-context-support-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.scheduling.quartz.AdaptableJobFactory.newJob(AdaptableJobFactory.java:48) ~[spring-context-support-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.quartz.core.JobRunShell.initialize(JobRunShell.java:127) ~[quartz-2.2.3.jar:na]
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:375) [quartz-2.2.3.jar:na]
Caused by: java.lang.NullPointerException: null
at com.scm.util.common.JobFactory.createJobInstance(JobFactory.java:18) ~[classes/:na]
at org.springframework.scheduling.quartz.AdaptableJobFactory.newJob(AdaptableJobFactory.java:57) ~[spring-context-support-4.0.6.RELEASE.jar:4.0.6.RELEASE]
... 3 common frames omitted
16:06:10.033 [startQuertz_QuartzSchedulerThread] INFO org.quartz.simpl.RAMJobStore - All triggers of Job BL_MAT_INFO.BL_MAT_INFO set to ERROR state.
16:06:10.033 [startQuertz_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 0 triggers