集群環境下如何防止定時任務重複執行?

2021-07-10 14:23:14 字數 2209 閱讀 4873

起因

最近做專案是遇到這樣乙個問題:系統需要在每天的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 只在一台伺服器上部署該定時任務 優點 解決方法容易理解 缺點 部署麻煩,需要多套 且當這...