Spring整合Quartz时,任务类中无法注入Bean的问题

 项目中需要在tomcat启动时候就启动定时器运行定时任务,定时器采用在spring中集成quartz。

但是遇到了在任务类中需要引用注入类,但是注入类对象zhuangbeietongService为空,故查询原因得知:Quartz初始化是自己的JobContext,不同于Spring的ApplicationContext,所以无法直接注入,导致使用时产生空指针异常!


public class SyncTrackLastJob extends QuartzJobBean

{

    @Resource(name="zhuangbeietongService")

    IFromBigDataDetailService zhuangbeietongService;

    

    @Override

    protected void executeInternal(JobExecutionContext context) throws JobExecutionException

    {

   zhuangbeietongService.syncTrackLast(null,null);

    }

}

 

      解决办法如下:

       1)自定义JobFactory,通过spring的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;

    }

}

2)定义上述类之后,需要在定义触发器,引用org.springframework.scheduling.quartz.SpringBeanJobFactory的地方,配置property,例如(见红色部分):

 <!-- 定时作业工厂,添加所有任务触发器 -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="syncTrackLastJobTrigger" /> 
            </list>
        </property>
        <!-- 所有Scheduler 延迟5s 启动 -->
        <property name="startupDelay" value="5"/>
        <property name="configLocation" value="classpath:/applicationContext/quartz.properties"/>        
       <property name="jobFactory">
            <bean class="com.xxx.JobFactory" />
        </property>

</bean>


<!-- SyncTrackLastJob类为任务类  -->

 <bean name="syncTrackLastJob" class="org.springframework.scheduling.quartz.JobDetailBean">
      <property name="jobClass" value="com.zoomlion.platform.schedule.jobs.SyncTrackLastJob" />
 </bean>


 <!-- 定时任务:设定测试任务的另一个触发器,在指定时间点运行 -->

    <bean id="syncTrackLastJobTrigger"
    class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="syncTrackLastJob" />
    <property name="cronExpression">
      <!--秒,分, 时, 日期, 月, 星期, 年  -->
    <value>0 00 12 * * ?</value>
    </property>
    </bean>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值