Quartz定时器中Service注入时空指针问题解决

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhong_jay/article/details/78315603

上周在做一个任务调度时,用到了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

   

扫描二维码关注公众号,回复: 4782565 查看本文章
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;
	
}




猜你喜欢

转载自blog.csdn.net/zhong_jay/article/details/78315603
今日推荐