Quartz在spring下的動態任務實現

動態任務即爲任務在服務啓動情況下,動態添加,刪除,更新job或者trigger。

網上已經有很多關於Quartz+spring的實現方案,但是這些都是關於啓動時加載XML或其他配置文件,將任務加載到Quartz中去執行,沒有關於如何徹底動態操作任務(job+trigger)。

我的工作是將Quartz添加到spring中去,步驟:

1,引入quartz-x.x.x包。不考慮spring容器,但是依舊是在spring 容器下實現。自己的服務直接調用quartz的api,即可實現動態任務。

       quartz的文檔(example,配置)很豐富,很容易實現。對於quartz.properties文件添加屬性,逐步修改,測試。很容易實現RAMStore到JDBCStore的轉變,集羣。其他一些關於任務優先級控制,misfire設置,狀態保持,請求恢復,任務完成後是否自動刪除等特徵,需要修改部分程序即可實現。

       我在這個過程中,碰到的問題主要有quartz容器的啓動和刪除,啓動我可以通過spring的bean設置來實現,但是刪除不會實現,雖說我知道就是調用scheduler的shutdown函數即可(後來知道怎麼實現,實現DisposableBean接口)。但是不依賴spring,使得這個quartz容器是在spring容器裏面,但是不受spring容器管理(線程管理,上下文環境,數據源),果斷不能忍受。

2,加入spring-context-support包,調用裏面的spring對quartz的封裝來實現spring容器對quartz容器的管理。很少有關於這個包進行動態任務添加的資料,於是我便這個包進行閱讀了一下。

       說句心裏話,看完後,對於這個quartz的封裝,有些失望。他只是能夠進行文檔載入任務執行,不能進行動態任務(沒有接口)。唯二的亮點就是能夠運行實現runnable的對象任務,不要求任務必須是job接口的實現;另一點是MethodInvokingJobDetailFactoryBean的實現,能夠執行任意對象的任一方法(很方便對於沒有對象源代碼的接口進行任務調度),其實現是使用method invoker,內部類實現job接口。

       迫不得已,我使用schedulerFactoryBean(即spring容器)來管理quartz容器,我使用getobject返回的scheduler對象來進行Quartz的api調用,實現動態調用,解決問題。(我的測試沒有遇到問題,如有讀者有遇到問題,可以和我交流一下)

------------------------

Quartz的任務調度框架基本整合到這裏爲止了。下一步工作,由於多個框架的都有自己連接池,需要引入JNDI,來實現多框架連接池的同一調用。

參考資料:

1,官方資料。http://quartz-scheduler.org/docs/index.html

2,Spring整合Quartz定時發送郵件。 http://www.docin.com/p-75502414.html

-----------------------------------------------------

WARN : org.quartz.impl.jdbcjobstore.JobStoreTX - This scheduler instance is still active but was recovered by another instance in the cluster.  This may cause inconsistent behavior.

原因:cluster中各機器之間的時間不同步。

應同步各機器時間,另設置cluster-checkin iterval。
The systems are syncronized via NTP。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章