解决Spring中Quart无法自动注入Bean问题

来源:互联网 发布:城通网盘软件下载 编辑:程序博客网 时间:2024/05/22 01:43

        因项目需求,之前项目中已经有定时器的例子了,但是需求那边过来的需求之前用的定时器并不能满足,之前的定时器是用spring里面的@Scheduled(cron = "0 0 0 * * ? ")这种方式,这是一种死的定时器,需求要的是动态定时器,用户添加一个定时器,则系统就要自动添加一个定时器,等待执行。   才出现以下在执行的时候,出现对象空值的情况。

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

废话不多说,直接上代码:

A.第一步:

    这是一个(quartz的job中注入spring对象) 的类,查阅各种资料,这个类是必须的。

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;


/**
 *
 * @author hhd
 *  quartz的job中注入spring对象
 *
 */
public class SpringBeanJobFactory extends AdaptableJobFactory{  
        
    @Autowired  
    private AutowireCapableBeanFactory capableBeanFactory;  
    
    
    @Override  
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {  
        //调用父类的方法  
        Object jobInstance = super.createJobInstance(bundle);  
        //进行注入  
        capableBeanFactory.autowireBean(jobInstance);  
        return jobInstance;  
    }  
      
}

        这个类,说明一下。根据个人情况,网上查阅资料显示:有人重新定义了一个Job的接口,然后定义一个AdaptableJobFactory类,让这个类实现刚刚定义的Job接口,他这里的意思就是说,定义一个新的接口,让这个接口覆盖原来的Job接口。接着就是quartz的job中注入spring对象 这个类,继承 刚刚定义一个AdaptableJobFactory类。

      这种情况,根据个人的需求试过了,根本不起作用,也是无法自动注入Bean。

B.第二步

配置spring.xml  ,在spring.xml中添加以下bean 即可,注意:第一个bean里面的bean为自己定义的类的路径

     <!-- 配置spring-quartz,解决quartz的job无法注入spring对象的问题 -->
    <bean id="jobFactory" class="com.cmsz.monitor.schedule.SpringBeanJobFactory"/>
    
    <!-- 调度器 -->
    <bean name="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        
        <property name="jobFactory" ref="jobFactory"/>
    </bean>

C.第三步:

定时器的执行器类。 这个类直接实现Job接口

import org.quartz.Job;

public class QuartzJobExample implements Job {
    
    @Autowired
    private RuleDao ruleDao;

    /**

    *执行方法

    */

     @Override
  public void execute(JobExecutionContext arg0) throws JobExecutionException {

     //这里可以尝试打印注入的bean对象是否成功,如果不成功,会打印 出null   成功则打印一个对象出来。

    System.out.println(ruleDao);

  }

}

如果执行器类,打印的是一个对象,那么你的问题也是解决了,但是对我的这个需求来说还是打印的null。

通过网上资料,看到一个,个人抱着并不成功的想法试着把代码写上去,结果还真的打印出一个对象了。

代码如下:

      //自动注入成员变量实现类
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);

上面这行代码需要放在执行器类的执行方法里面。

因为项目出现问题,查找资料,并没有一个完整的解决办法,所以记录这个人尝试成功的过程。希望可以给大家带来帮助。。。。



阅读全文
0 0
原创粉丝点击