Quartz初始化是自己的JobContext,不同于Spring的ApplicationContext,所以无法直接注入,导致使用时产生空指针异常!
一般情况下,quartz的job中使用autowired注解注入的对象为空,这时候我们就要使用spring-quartz提供的AdaptableJobFactory类。
自定义一个类:
package com.zking.q03.quartz;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Component;
@Component //(把普通pojo实例化到spring容器中,相当于配置文件中的
public class MyJobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
//调用父类的方法
Object jobInstance = super.createJobInstance(bundle);
//进行注入(这一步解决不能spring注入bean的问题)
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
注:AutowireCapableBeanFactory可以使用这个接口集成其它框架,捆绑并填充并不由Spring管理生命周期并已存在的实例。
因为我用springBoot开发的所以写了一个QuartzConfigration 配置文件。
package com.zking.q03.quartz;
import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import java.io.IOException;
import java.util.Properties;
@Configuration
public class QuartzConfigration {
@Autowired
private MyJobFactory myJobFactory; //自定义的factory
//获取调度器的工厂bean
@Bean
public SchedulerFactoryBean schedulerFactoryBean() {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
try {
//修改成自己的工厂
schedulerFactoryBean.setJobFactory(myJobFactory);
return schedulerFactoryBean;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
//创建schedule调度器
@Bean(name = "scheduler")
public Scheduler scheduler() {
return schedulerFactoryBean().getScheduler();
}
}
如果你的是xml文件可以直接在spring中配置
<!-- 定时任务的factorybean,配置其他config -->
<bean id="myJobFactory" class="com.zking.q03.quartz.MyJobFactory"></bean>
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobFactory" ref="myJobFactory"></property>
</bean>
最后你就可以在实现Job或继承QuartzJobBean的类中使用@autowired注解了。