定時任務排程服務(含分多例項鎖 多例項同步)

2021-09-24 01:33:47 字數 3747 閱讀 8654

專案開發過程中,或多或少會涉及到需要定時任務來執行處理的功能模組;而往往定時任務處理是很重要的一層;對定時任務的管控與監控就顯得很重要。本文就如何對定時任務動態管理,與簡單監控做以說明。

/**

* @author

* @description 定時任務配置類

* @date 2019/5/14 18:47

**/@component

@enablescheduling

public class taskconfig implements schedulingconfigurer

@override

public void configuretasks(scheduledtaskregistrar scheduledtaskregistrar) else

futures.put(taskbean.gettaskcode(), future);}}

public class taskthread extends thread

public taskbean gettaskbean()

public void settaskbean(taskbean taskbean)

@override

public void run() 】】", lock);

} else 成功】,任務編碼:{},任務名稱:{}", lock, taskbean.gettaskcode(), taskbean.gettaskname());

//獲取最新的task任務執行資訊

taskbean = taskbeandao.findbyid(taskbean.getid()).orelse(null);

//todo 驗證執行時間是否有效 避免鎖在毫秒級就被釋放

long executetime = (time - timeout - taskbean.getlastexecutetime().gettime()) / 1000;

if (executetime < interval_time) ,任務名稱:{}", lock, taskbean.gettaskcode(),

taskbean.gettaskname());

return;

}//呼叫業務模組進行處理

logger.info("【執行定時任務【編碼:{}】開始】 任務名稱:{}", taskbean.gettaskcode(), taskbean.gettaskname());

合法性校驗.

if (stringutils.isempty(taskbean.getcron())) 】執行計畫為空】,任務名稱:{}", taskbean.gettaskcode(), taskbean.gettaskname());

} else 】呼叫業務層返回:{}", taskbean.gettaskcode(), postresult);

}logger.info("【執行定時任務【編碼:{}】結束】 任務名稱:{}", taskbean.gettaskcode(), taskbean.gettaskname());

} catch (exception e) ,任務名稱:{}", taskbean.gettaskcode(),

taskbean.gettaskname());

logger.error(e.getmessage(), e);

} finally 】成功】,任務編碼:{},任務名稱:{}", lock, taskbean.gettaskcode(),

taskbean.gettaskname());}}

}}

public map> getfutures()

}

任務鎖處理類:獲取鎖與釋放鎖的處理工具類。

/**

* @author

* @description $

* @date 2019/5/23 9:59

**/@component

public class redislockhelper

// 判斷鎖超時 - 防止原來的操作異常,沒有執行解鎖操作 防止死鎖

string currentlock = stringredistemplate.opsforvalue().get(targetid);

// 如果鎖過期 currentlock不為空且小於當前時間

if(!strings.isnullorempty(currentlock) && long.parselong(currentlock) < system.currenttimemillis())

}return false;

}/**

* 解鎖

* @param target

* @param timestamp

*/public void unlock(string target,string timestamp)

} catch (exception e) ",e);}}

}

redis配置類:主要針對的是多例項間,任務同步問題,即某一例項任務執行計畫有變動,則通知其他例項,也進行相應的變動。這裡採用的是redis的訊息發布與訂閱模式。這裡重要的是訂閱主題。一定要設定監聽的topic。

@configuration

@enablecaching

public class redisconfig

@bean

redismessagelistenercontainer container(redisconnectionfactory connectionfactory,

messagelisteneradapter listeneradapter) );

return container;

}@bean

messagelisteneradapter listeneradapter(messagereceive receiver)

}

訊息訂閱處理類

/**

* @author

* @description redis 訊息處理器

* @date 2019/6/4 14:25

**/@component

public class messagereceive ",message);

jsonarray object = json.parsearray(message);

jsonobject jsonobject = object.getjsonobject(1);

taskbean taskbean = taskbeandao.findbyid(jsonobject.getlong("id")).orelse(null);

logger.info("【匹配定時任務為】,{}",jsonobject.tojsonstring(taskbean));

if (taskbean.getenable().equals(taskbeanenableenum.disable_status.gettype()))else

}}

最後,在任務變動的業務處理模組只需要新增如下**即可。

//redis發布訊息通知,通知其他例項變動

logger.info("【redis發布訊息通知,重新整理定時任務,通知其他例項變動】,任務名稱:{}", taskbean.gettaskname());

redistemplate.convertandsend(taskbean.gettaskcode(), taskbean);

linux實操 定時任務排程

crond任務排程 語法 crontab 選項 e編輯crontab定時任務 i查詢crontab任務 r刪除當前使用者所有的crontab任務 service crond restart 重啟任務排程 5個佔位符的說明 專案含義 範圍第乙個 一小時當中的第幾分鐘 0 59 第二個 一天當中的第幾小...

定時任務排程

在業務複雜的應用程式中,有時候會要求乙個或者多個任務在一定的時間或者一定的時間間隔內計畫進行,比如定時備份或同步資料庫,定時傳送電子郵件等,我們稱之為計畫任務。定時任務排程實現方式 但是1,3可以實現在一定時間執行,2只能實現在一定時間間隔執行。1 thread方式 開啟執行緒 public cla...

Linux定時任務排程

linux定時任務 為當前使用者建立cron服務 1.鍵入 crontab e 編輯crontab服務檔案 例如 檔案內容如下 2 bin sh home admin jiaoben buy deletefile.sh 儲存檔案並並退出 2 bin sh home admin jiaoben buy...