一、前言
在開發(fā)中會有定時任務的場景需要用到定時任務,如訂單超時需要自動取消訂單、數(shù)據(jù)需定時備份、定時短信郵件的發(fā)送等,如此涉及到幾個概念:
- 任務:業(yè)務邏輯的實現(xiàn),如定時生日短信發(fā)送
- 調度器:根據(jù)配置(cron表達式)來告知執(zhí)行器去執(zhí)行任務
- 執(zhí)行器:任務執(zhí)行的載體
二、springBoot中的實現(xiàn)
1、代碼實現(xiàn)
@Configuration
@EnableScheduling//標識這個類是定時任務類
@EnableAsync//定義這個類可以用異步線程
public class MyTask{
@Scheduled(cron = "* * * * * ?")//cron可以分為6個參數(shù)或者7個參數(shù)【秒、分、時、天、月、周、年】
@Async//定義該方法用異步
publicvoid task(){}
}
其中我們查看timer的源碼可以發(fā)現(xiàn),timer內部加了同步鎖,同一個timer默認是單線程的定時任務,如果任務持續(xù)時間較長,就會將后續(xù)定時任務拖延,導致丟失任務。
2、spring中定時任務存在的問題
- 不支持集群部署:比如你啟動三個實例,每個實例都會去觸發(fā)執(zhí)行器去執(zhí)行“優(yōu)惠券要過期給用戶發(fā)送一個提醒”這個任務,這時候就產生了重復執(zhí)行的問題。
- 通常是單機部署的,單機就存在掛掉的風險。
- 不支持失敗重試:出現(xiàn)異常后任務終結,不能根據(jù)執(zhí)行狀態(tài),控制任務重新執(zhí)行
- 不支持動態(tài)管理:不重啟任務情況下,關閉和啟動任務,修改cron表達式等。
- 無報警:任務失敗后不能發(fā)送報警通知
- 不支持分片任務
三、XXL-JOB簡要介紹
地址:https://gitee.com/xuxueli0323/xxl-job/、https://github.com/xuxueli/xxl-job
XXL-JOB是一個輕量級分布式任務調度平臺,其實現(xiàn)原理是:調度中心會配置 cron表達式,路由策略,處理類的bean實例,執(zhí)行器需要向調度中心發(fā)生心跳,對于長時間沒有收到心跳的執(zhí)行器,調度中心會將其剔除
其中在高可用過程中xxl-job-admin是通過xxl_job_qrtz_locks表來競爭數(shù)據(jù)庫鎖保證多個調度中心分發(fā)任務只分發(fā)一次

image.png
以下是xxl-job的架構圖

image.png
四、PowerJob簡要介紹
地址:https://github.com/KFCFans/PowerJob

架構圖
五、定時任務調度框架的對比

image.png
六、公司目前的技術選型是XXL-JOB,故用XXL-JOB用來開發(fā)實踐
1、先把git上的文件clone下來,運行doc目錄下的tables_xxl_job.sql

image.png
2、啟動admin
修改admin中的配置文件,改成自己本地的信息
3、啟動"執(zhí)行器"
xxl-job-executor-sample-springboot/src/main/resources/application.properties配置說明
### 調度中心部署跟地址 [選填]:如調度中心集群部署存在多個地址則用逗號分隔。執(zhí)行器將會使用該地址進行"執(zhí)行器心跳注冊"和"任務結果回調";為空則關閉自動注冊;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### 執(zhí)行器AppName [選填]:執(zhí)行器心跳注冊分組依據(jù);為空則關閉自動注冊
xxl.job.executor.appname=xxl-job-executor-sample
### 執(zhí)行器IP [選填]:默認為空表示自動獲取IP,多網(wǎng)卡時可手動設置指定IP,該IP不會綁定Host僅作為通訊實用;地址信息用于 "執(zhí)行器注冊" 和 "調度中心請求并觸發(fā)任務";
xxl.job.executor.ip=
### 執(zhí)行器端口號 [選填]:小于等于0則自動獲?。荒J端口為9999,單機部署多個執(zhí)行器時,注意要配置不同執(zhí)行器端口;
xxl.job.executor.port=9999
### 執(zhí)行器通訊TOKEN [選填]:非空時啟用;(注意與調度中心保持一致)
xxl.job.accessToken=
### 執(zhí)行器運行日志文件存儲磁盤路徑 [選填] :需要對該路徑擁有讀寫權限;為空則使用默認路徑;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 執(zhí)行器日志保存天數(shù) [選填] :值大于3時生效,啟用執(zhí)行器Log文件定期清理功能,否則不生效;
xxl.job.executor.logretentiondays=-1
真是開箱即用,操作簡單
參考官網(wǎng)地址:https://www.xuxueli.com/xxl-job/#%E4%BA%8C%E3%80%81%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8