2025-05-17

動態任務即為任務在服務啟動情況下,動態添加,刪除,更新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,來實現多框架連接池的同一調用。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *