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

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

自定义一个类:

第一步:自定义一个类:

public class MyJobFactory extends AdaptableJobFactory {

    //这个对象Spring会帮我们自动注入进来,也属于Spring技术范畴.
    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;
    
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        //调用父类的方法
        Object jobInstance = super.createJobInstance(bundle);
        //进行注入,这属于Spring的技术,不清楚的可以查看Spring的API.
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}

 

第二步:在quartz.xml中修改为

<bean id="quartzJob" class="com.thinkgem.jeesite.modules.schedule.CrmSchedule"></bean><!--普通类-->

<bean id="jobFactory" class="com.thinkgem.jeesite.modules.schedule.MyJobFactory"></bean>
        <!-- 定义调用对象和调用对象的方法 -->  
        <bean id="quartzTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
            <!-- 调用的类 -->  
            <property name="targetObject">  
                <ref bean="quartzJob"/>  
            </property>  
            <!-- 调用类中的方法 -->  
            <property name="targetMethod">  
                <value>tips</value>  
            </property>  
        </bean>  

<bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
            <property name="jobFactory" ref="jobFactory"/>
            <property name="triggers">  
                <list>  
                    <ref bean="jibDoTime"/>  
                </list>  
            </property>  
            <!--必须的设置 QuartzScheduler 延时启动,应用启动完后 QuartzScheduler 再启动 -->  
            <property name="startupDelay" value="5"/>  
          </bean>   

第三步:

public class CrmSchedule{
    @Resource
     private  WorksheetFlowService worksheetFlowService;
    @Resource
    private  WorksheetStyleTService worksheetStyleTService;
    @Resource
    private  WorksheetService worksheetService;
    @Resource
    private  SystemService systemService;
    public void tips() {
        //testSevice.sayHi();
        String time = new SimpleDateFormat("MMM d,yyyy KK:mm:ss a",Locale.ENGLISH).format(System.currentTimeMillis());  
        System.out.println("time:"+time);//time:Mar 29,2017 09:25:00 AM
        //业务逻辑
    }

以上就是我的解决方法

posted @ 2017-06-19 11:56  chenfj_fer  阅读(3221)  评论(0编辑  收藏  举报