1. 程式人生 > >Quartz定時器中Service注入時空指標問題解決

Quartz定時器中Service注入時空指標問題解決

上週在做一個任務排程時,用到了Quartz定時器,用的xml配置方式,隨後進行資料庫操作時,發現service注入不進去,報空指標錯誤,然後網上查了一些資料,找到了一個比較好的解決方法,詳情如下:

1.      問題:用quartz定時器中的QuartzJobBean進行業務處理時,service物件會報空指標異常

2.      原因:job是在quartz中例項化出來的,不受spring的管理,所以就導致service注入不進去了

3.      解決方法:

        1)  在定時器的配置中加入jobDataAsMap,用來向JobDetail傳參,配置要注入的service物件

        2)  配置具體操作的類

      

<bean id="complexJobDetail"  
            class="org.springframework.scheduling.quartz.JobDetailFactoryBean">  
            <property name="jobClass" value="data.shijue.scheduling.schedulingStuGraduate" />  
            <property name="durability" value="true" />  
            <property name="jobDataAsMap"><!-- 非常重要,用來向JobDetail傳參 -->  
                <map>  
                  <entry key ="studentPersonService" value-ref="studentPersonService"/>  
                  <entry key="timeout" value="5" />  
                </map>  
            </property>  
        </bean>  
        <bean id="cronTrigger"  
            class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
            <property name="jobDetail" ref="complexJobDetail" />  
            <!-- 每年的8月15執行 --> 
            <property name="cronExpression" value="1 0 0 15 8 ? *" />  
        </bean>  
        <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
            <property name="jobDetails">  
                <list>  
                    <ref bean="complexJobDetail" />  
                </list>  
            </property>  
            <property name="triggers">  
                <list>  
                    <ref bean="cronTrigger" />  
                </list>  
            </property>  
        </bean>  
        <!-- 工作的bean,一定要配置 -->  
        <bean id="schedulingStuGraduate" class="data.shijue.scheduling.schedulingStuGraduate" />  


        3)  在類中通過getJobDataMap()獲取注入成功的service

   

public class schedulingStuGraduate extends QuartzJobBean{
	/**
	 * 排程
	 * 每年8月15日0時0分01秒執行該方法
	 * */
	@Override
	protected void executeInternal(JobExecutionContext context)
	throws JobExecutionException { 
		try {
			//通過getJobDataMap()來獲取具體的Service
                        studentPersonService= (StudentPersonService) context.getJobDetail().
					getJobDataMap().get("studentPersonService"); 
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("xjydlb", "1B91DA03-F6FD-42ED-8B8E-D0E8F4BB7E20");
			studentPersonService.updateGraduate(map);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	@Autowired
	private  StudentPersonService studentPersonService;
	
}