首先是osgi環境要ok,可以參考之前的部落格;
然後是quartz集群方案,這個比較繞;
最後是兩者的結合,這個很蛋疼,基礎不牢,搞了我一周
背景:集群環境下,quartz的任務會在每個節點上同時執行,這就亂套了,如果涉及到寫資料庫,還可能造成更大的麻煩,所以quartz在集群環境下需要考慮特殊解決方案。
解決方案1:集群上只部署乙個quartz節點,繞開上述問題
解決方案2:一般是更新資料儲存,在更新邏輯上加鎖,或者增加業務邏輯**,使得任務不被多次執行
解決方案3:把quartz的任務持久化到資料庫中,每次任務觸發,先到資料庫中寫入當前任務,並加鎖,其他節點讀取此任務或者寫入此任務的時候,遇到鎖,就不執行了,從而避免上述問題。
本部落格介紹解決方案3 的執行思路
具體做法:
-之前在網上有前輩搞了個集群quartz方案,不過是基於普通web專案的,大致思路是,quartz把任務持久化入資料庫,但是由於quartz的類或者是自己自定義的任務類沒有實現 serializable介面,導致持久化失敗。所以重寫methodinvokingjobdetailfactorybean類,傳入自己的任務類,任務類實現自定義的job介面,這個任務類在引用自己實際的定時任務,具體demo可以baidu或者google一下。由於osgi的類載入機制不同,所以這裡需要注意一些類載入的問題
-基於osgi,最好把實際的定時任務單獨搞成bundle,並發布出服務
-單獨搞個quartz bundle,引用上面的服務,引用quartz包
com.opensymphony.quartz
com.springsource.org.quartz
1.6.2
並且把這個工程打成bundle,並把org.quartz裡面的包export出來,供你自己的http bundle import
-持久化問題,推薦使用plan的方式跑,不然會報莫名其妙的錯誤,然後需要自己為quartz單獨配置資料來源,不然會報無法獲取trigger的異常
然後就可以了
集群環境下,誰偷走quartz配置的定時任務
錯誤現象 在本地開發環境中,應用服務啟動後 trigger state 直接就變為 error 前段時間在專案中,使用 quartz 配置乙個定時任務,定時任務都持久化到 oracle 資料庫中,但是應用伺服器啟動後,資料庫 qrtz triggers trigger 資訊表 中,對應的任務資料的 ...
在Spring 下配置Quartz集群
由於專案將要上線,而專案中的quartz集群配置一直沒時間弄,本以為應該是一件挺簡單的事,沒想到gooble了一兩天才解決問題,主要是因為spring到3.0.7這個版本為止都沒有原生支援quartz的集群,原來的quartz配置在單例項下執行正常,配置集群之後各種異常都來了,今天終於配置成功,在這...
osgi 環境下 hibernate 4 配置
準備將公司的老應用遷移到osgi karaf平台上。很 的一點就是hibernate。這玩意,真是超級麻煩的乙個工程。classload是最頭痛的乙個問題。在hibernate4上利用註冊服務的方式 實現了 classloader的 順便提一句想用hibernate3做reloadclass的同學們...