在應用中使用定時任務進行些資料處理,而放到集群服務裡就發現了問題。一是要避免任務被重複執行,二是解決了問題一的情況下一些資料量大的任務只用一台機器處理效率也低。
網上也有挺多類似框架可以做的集群裡的定時任務控制,有興趣可以去查一查。這裡我選擇的利用mysql的行級鎖(同一時間只有乙個執行緒能操作同一行記錄)在集群中對任務進行控制,這樣需要建一張任務資訊相關的表,恰好應用中也需要,方便檢視情況,也便於在一些極端情況下能控制定時任務的執行。
下面說實現:
-一,避免重複執行
可以在任務表中新增標識字段(類似version),在任務執行前可以先執行「update 任務表 set 標識=1 where 標識=0」之類的sql語句,更新成功則可以看作獲取到了執行任務的鎖,失敗則代表任務已被執行,任務執行完成即可將標識置回未執行狀態,如:0。
-二,充分利用集群的優勢盡快處理資料
可以在表中設定資料量的大小或任務需處理的次數,與任務執行結果字段(任務結果需記錄多個分支任務執行結果,可使用分段字元表示),在標識小於資料量或執行次數時,即可獲取執行任務的鎖,至於任務所處理資料的範圍可在**中或者其他地方自行控制。(若需同一機器執行多次,可做遞迴處理。)
任務執行完成時,需利用select for update去獲取任務結果,更新並判斷執**況,若全部完成則需重置標識。
有分支任務發生異常中斷時,則可遞迴重試(注意控制重試次數)。
(大體就是,標識控制任務不被重複執行,資料量決定任務分支的多少,任務結果作為整體任務執**況的判定)
處理方式也比較笨拙了,如有不對和改進的地方,多多指教。
Spring定時任務
sayhello 0 08 21 下面的表示式 0 15 10 6l 2002 2005 將在2002年到2005年的每個月的最後乙個星期五上午10點15分執行作業。你不可能用 trigger來做這些事情。你可以用兩者之中的任何乙個,但哪個跟合適則取決於你的排程需要。更多詳細介紹參考此處 關於cro...
spring 定時任務
xmlns 多加下面的內容 xmlns task 然後xsi schemalocation多加下面的內容 spring task 3.1.xsd最後是我們的task任務掃瞄註解 或者 public inte ce imytestservice component import org.springf...
Spring 定時任務
scheduled cron 0 0 1 override public synchronized void dojob throws exception 字段 允許值 允許的特殊字元 秒 0 59 分 0 59 小時 0 23 日期 1 31 l w c 月份 1 12 或者 jan dec 星期...