解決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
        //業務邏輯
    }

以上就是我的解決方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM