java - 一个项目在集群中运行,如何让定时任务只运行一次?
黄舟
黄舟 2017-04-18 10:32:05
0
8
1101

一个项目在集群中运行,如何让定时任务只运行一次?不加限制就会导致重复计算的问题。

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回覆(8)
洪涛

java的話,建議使用quartz,
1.quartz做各類定時任務很方便
2.它是支援集群的,原理是透過資料庫表來保證同一個任務只在一個服務上執行。

左手右手慢动作

假設你最簡單的方式使用quartz,那麼你在代碼中就要修改了,在job邏輯中加入獲取鎖的操作,這個鎖可以做到數據庫,具體方法是:插入一條有業務意義主鍵記錄,執行時,叢集中相同的job只會有一條插入成功,這就代表它獲得了鎖,可以執行,否則退出此次job,不執行。

Ty80

Configure Clustering with JDBC-JobStore

Quartz’s clustering features bring both high availability and scalability to your scheduler via fail-over and load balancing functionality.

quartz 本身就是支援集群,容錯,負載平衡的。不需要改任何程式碼即可實現。

巴扎黑

quartz框架支援叢集

左手右手慢动作

可以做一個中間件系統,專門管理定時任務的觸發和訊息的訂閱和消費,到了時間觸發時就發一個訊息出來,由集群系統來訂閱這條訊息。訊息可以隨機投遞到叢集中任何一台機器。

左手右手慢动作

一台機器定時開始就要透過訊息廣播給其它機器。但每台機器時間間隔是個問題,沒等訊息發送就都定時開啟了...

阿神
  1. 使用zookeeper,redis等手動儲存定時任務執行狀態等信息,保證只執行一次。

  2. 將定時任務抽取到一個單獨的專案中(單機運作),但是任務具體內容透過遠端呼叫(dubbo,mq等)呼叫具體的分散式服務。也就是定時任務只是單獨的用於任務觸發,具體任務還是分散式執行的。

  3. 使用各種分佈任務調度系統,如Uncode-Schedule

Ty80

傾向於單獨拉出來弄個stand-alone的程式

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板