解决quartz的job无法注入spring对象

Quartz初始化是自己的JobContext,不同于Spring的ApplicationContext,所以无法直接注入,导致使用时产生空指针异常!

两种方法,都差不多:

1.一般情况下,quartz的job中使用autowired注解注入的对象为空,这时候我们就要使用spring-quartz提供的AdaptableJobFactory类。

自定义一个类:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class JobFactory extends AdaptableJobFactory {  
  2.       
  3.     @Autowired  
  4.     private AutowireCapableBeanFactory capableBeanFactory;  
  5.   
  6.     @Override  
  7.     protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {  
  8.         //调用父类的方法  
  9.         Object jobInstance = super.createJobInstance(bundle);  
  10.         //进行注入  
  11.         capableBeanFactory.autowireBean(jobInstance);  
  12.         return jobInstance;  
  13.     }  
  14.       
  15. }  
然后在spring中配置:
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <!-- 定时任务的factorybean,配置其他config -->  
  2.     <bean id="jobFactory" class="com.xiaoye.job.JobFactory"></bean>  
  3.     <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  4.         <property name="jobFactory" ref="jobFactory"></property>  
  5.     </bean>  

这时候,我们在定义类继承job的时候,就可以使用autowired注入service对象了:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class Test1Job implements Job {  
  2.     public final Logger log = Logger.getLogger(this.getClass());  
  3.       
  4.     @Autowired  
  5.     private JobTaskService jobTaskService;  
  6.       
  7.     public void execute(JobExecutionContext context) throws JobExecutionException {  
  8.         //更新上一次执行时间和下一次计划执行时间  
  9.         Date nextProcessTime = context.getNextFireTime();  
  10.         ScheduleJob job = (ScheduleJob) context.getJobDetail().getJobDataMap().get("scheduleJob");  
  11.         job.setNextProcessTime(nextProcessTime);  
  12.         jobTaskService.updateTaskByJobName(job);  
  13.           
  14.         //业务逻辑  
  15.         System.out.println("12312312321:");  
  16.     }  
  17. }  

2.自定义JobFactory,通过spring的AutowireCapableBeanFactory进行注入

JobFactory:

package com.xiaoye.app.schedule;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;

public class JobFactory extends org.springframework.scheduling.quartz.SpringBeanJobFactory {
	@Autowired
	private AutowireCapableBeanFactory beanFactory;
	/**
		 * 这里覆盖了super的createJobInstance方法,对其创建出来的类再进行autowire。
		 */
	@Override
	protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
		Object jobInstance = super.createJobInstance(bundle);
		beanFactory.autowireBean(jobInstance);
		return jobInstance;
	}
}

定时任务类:

package com.xiaoye.app.schedule;

import java.sql.SQLException;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;
import com.xiaoye.app.service.IStudyService;

public class JobPlan extends QuartzJobBean {
	@Autowired
	private IStudyService studyService;
	@Override
	protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
		try {
			studyService.updateStudyScheduler();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}

}

application.xml

    注意jobFactory的配置

<!-- 配置定任务 -->
	<bean id="myJobDetail"
		class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
		<property name="jobClass" value="com.xiaoye.app.schedule.JobPlan"></property>
		<property name="durability" value="true"></property>
	</bean>
	<!-- 配置任务触发器,何时,什么频率 -->
	<bean id="myJobTrigger"
		class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail" ref="myJobDetail"></property>
		<property name="cronExpression" value="0 0 0 ? * MON"></property>
	</bean>
	<!-- 把配置好的定时任务与任务触发器整合到调度任务管理器中,统一管理 -->
	<bean id="startSchedulerDriver"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<!-- 定时任务 -->
		<property name="jobDetails">
			<list>
				<ref bean="myJobDetail" />
			</list>
		</property>
		<!-- 任务触发器 -->
		<property name="triggers">
			<list>
				<ref bean="myJobTrigger" />
			</list>
		</property>
		<property name="jobFactory">
			<bean class="com.xiaoye.app.schedule.JobFactory"></bean>
		</property>
		<!-- 启动后延迟多久执行 -->
		<property name="startupDelay" value="5"></property>
	</bean>






猜你喜欢

转载自blog.csdn.net/chenyao1994/article/details/80482053