起因
最近做專案是遇到這樣乙個問題:系統需要在每天的16:00向一些符合特定條件的使用者傳送乙份郵件,傳送成功後修改掉資料庫中對應資料的標誌位。本來是沒有問題的,但後來系統被部署到了集群環境下,導致每天會向這些使用者傳送多次同樣的資料,遭到了客戶的抱怨。
解決
下面來介紹一下處理這種問題的解決辦法:
1.在資料庫中建立tm_job_group表
name
type
comments
group_id
number
組idinterval
number
時間間隔
區分定時任務的間隔
即多長時間內不可重複執行,單位分鐘
remark
varchar2(100)
描述 資料如下:
group_id
interval
remark
11440
24小時執行一次260
1小時執行一次
3120
2小時執行一次
2.在資料庫中建立一張tm_job表,用來儲存定時任務的資訊
name
type
comments
job_id
number
定時任務的id
job_name
varchar2(100)
定時任務的名稱
job_group
number
定時任務所屬的組
remark
varchar(100)
備註 資料如下:
job_id
job_name
job_group
remark
1催辦郵件傳送job
1每天16點執行
3.建立ts_job_log表
name
type
comments
job_log_id
number
job的logid,自增
job_id
number
定時任務id
job_group
number
定時任務所屬的組
job_start_time
date
執行時間
job_status
varchar2(10)
狀態 執**況
job_msg
varchar2(100)
備註 這三張表的外來鍵關聯可以自己設定,這裡就不寫了。
然後為ts_job_log表新增如下的約束:
create unique index idx_ts_job_log_starttime on ts_job_log(job_id,decode(job_group,1,to_char(job_start_time,'yyyymmdd'),2,to_char(job_start_time,'yyyymmddhh24'),3,trunc(to_char(job_start_time,'yyyymmddhh24')/2)),to_char(job_start_time,'dd-mon-rr'))
這個約束表示 當job_group為1時,在同一天不可以存在兩個一樣的job_id,當job_group為2時,在同一小時內不可存在兩個相同的job_id,job_group為3時,在兩個小時內不能出現同樣的job_id.
時間比較的是job_start_time的時間間隔。
在執行定時任務的操作時,先向資料表中insert一條資料,如:
insert into ts_job_log(job_log_id,job_id,job_group,job_start_time,job_status)
values(1,1,1,sysdate,』正常』);
可以新增成功
當再執行如下操作時
insert into ts_job_log(job_log_id,job_id,job_group,job_start_time,job_status)
values(2,1,1,sysdate,』正常』);
會報錯
如果在**中捕獲到錯誤就不執行定時任務中的操作。
總結
這種方法就是通過讓資料庫中的操作受到約束條件產生異常來實現的。
集群環境下如何防止定時任務重複執行?
起因 最近做專案是遇到這樣乙個問題 系統需要在每天的16 00向一些符合特定條件的使用者傳送乙份郵件,傳送成功後修改掉資料庫中對應資料的標誌位。本來是沒有問題的,但後來系統被部署到了集群環境下,導致每天會向這些使用者傳送多次同樣的資料,遭到了客戶的抱怨。解決 下面來介紹一下處理這種問題的解決辦法 1...
防止 crontab 定時任務重複執行
前言 crontab 定時任務很好使用,它的定時是很強硬的,直接跟系統時間打交道,不會去管程式本身執行是否需要時間。舉個栗子 乙個指令碼執行需要 1 小時,使用 crontab 每隔2小時執行一次,一般情況下下次執行指令碼時上次指令碼執行肯定是跑完了的 但是,假如,程式卡住了呢?下次執行時上次指令碼...
集群伺服器定時任務重複執行的解決方案
伺服器採用了負載均衡,有兩台伺服器,部署的 一樣,所以裡面的定時任務在某一時間會被同時執行,這就導致了很多其他意外的發生,想要解決的問題基本就三個 單點執行,故障轉移,服務狀態。這裡對比一下網上找的幾種方案,1 只在一台伺服器上部署該定時任務 優點 解決方法容易理解 缺點 部署麻煩,需要多套 且當這...