Spring 中Quartz配置數據庫化


       因為項目要求根據數據庫的配置信息啟動Spring中的Quartz的任務,這樣就要求CronTriggerBean是動態多樣的。搜索了很多文檔也沒有得其所以然,於是從Spring的配置信息進行入手了。

       網上介紹的各種例子中,默認都是以SchedulerFactoryBean進行開始的,也看到,里面就一個參數就是triggers,那么這樣就好說了,只要把trigger根據數據庫中的配置信息進行生成就好了。

       

<bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <property name="triggers">
                <list>
                    <ref bean="doTime"/>
                </list>
            </property>
        </bean>

       偽代碼就是這樣的,寫個類繼承SchedulerFactoryBean

   

XXXvo = queryDB();
CronTriggerBean bean = new CronTriggerBean();
bean.setBeanName("beanNameFileSchedule");
            bean.setCronExpression(xxxvo.getCronExpression());

            jobDetailFactoryBean.setArguments(new Object[] { XXX});

    
            bean.setJobDetail((JobDetail) jobDetailFactoryBean.getObject());
            bean.afterPropertiesSet();

this.setTriggers((CronTriggerBean[]) this.triggerBeanList
                .toArray(new CronTriggerBean[0]));
        this.afterPropertiesSet();

  這樣基本上就大功告成了,但是調試過程中的小問題卻不少。

第一:CronTriggerBean和SchedulerFactoryBean都實現了InitializingBean接口,這樣的話,需要在兩個類的設置完屬性之后,需要手動的調用afterPropertiesSet的方法。

第二:CronTriggerBean需要設置BeanName,原因看一下CronTriggerBean方法的afterPropertiesSet就知道了,quartz的trigger如果沒有Name的話,就會報出來錯誤。

第三:Schedule的執行類配置到了Spring的XML中,但又因Schedule的執行類的執行方法有參數,這個參數又是動態傳入的。這樣的一個問題就是在SchedulerFactoryBean中調用下面的方法【jobDetailFactoryBean.setArguments(new Object[] { XXX});】設置參數的時候就已經晚了,因為Spring在實例化MethodInvokingJobDetailFactoryBean的時候就會報出來找不到方法的錯誤。現在的處理方式就是先在XML中為MethodInvokingJobDetailFactoryBean配置一個假的參數進去,只是為了占據類型,然后在SchedulerFactoryBean中重新設置一遍,設置完成后,不能忘記調用afterPropertiesSet()方法,不然trigger不起作用。

 

     寫的稍微亂了一些,就先記錄下來吧,后續再整理了。




免責聲明!

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



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