背景
日常開發中,我們難免會遇到需要處理一些定時任務,而且這些定時任務還需要靈活的排程,並且在異常的情況下需要做的重試或者報警。這些任務我們希望能靈活配置,並且能及時生效,不需要經常發版本更新程式碼。所以我們希望能有一個這樣的平臺,能滿足我們的這些需求。感謝開源社群,已經有了很好的解決方案,就是 XXL-JOB。 本文介紹的版本是基於 XXL-JOB 的1.9.0版本,新版本排程中心 Admin 已經切換為 SpringBoot 專案了。
介紹
XXL-JOB[1]是一個輕量級分散式任務排程平臺,其核心設計目標是開發迅速、學習簡單、輕量級、易擴充套件。現已開放原始碼並接入多家公司線上產品線,開箱即用。中文文件地址[2]
XXL-JOB由兩個模組組成分為排程中心和執行器,作者許雪裡的開源專案,感謝大佬。
排程中心搭建
從release[3]拉取最新程式碼
根據自己的需要配置 xxl-job-admin 中 xxl-job-admin.properties 檔案中的資料來源資訊以及賬號密碼,以及 accessToken 和郵件伺服器地址等資訊
配置log4j.xml中日誌的路徑
將xxl-job-admin打包成war包,部署到tomcat中即可
執行器配置
新建 Springboot 專案,pom.xml中引入 xxl-job 的核心庫
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>1.9.0</version>
</dependency>
配置檔案中配置排程中心的地址和一些具體引數
編寫 jobHandler ,繼承 JobHandler 實現內部 execute 方法,具體的業務邏輯就在這個方法裡面實現。這種方式是通過Java程式碼來執行定時任務的,除了 JavaBean 方式還支援 Python,nodeJs,Shell 等方式。
我最喜歡的是 Python 方式,因為 Python 在處理簡單的定時任務的時候還是比較得心應手的,而且很快速,但是稍微複雜一點的就不方便了,而且 Python 可以直接 WebIDE 裡面直接貼上程式碼,實現功能,就不用發版本了,但是具體的需要看具體的業務。
@Service
@JobHandler(value = "demoHandler")
public class DemoHandler extends IJobHandler {
@Override
public ReturnT<String> execute(String s) throws Exception {
XxlJobLogger.log("日誌記錄資料...");
//do something
return ReturnT.SUCCESS;
}
}
新增任務
配置好排程中心並且也成功啟動了執行器後,登入排程中心新增執行器然後就可以配置任務了
新增執行器
新增任務
新增任務的時候需要選擇上一步建立的執行器,選擇執行模式,如果是 JavaBean 方式就配置 JobHandler,或者選擇 Python 模式等,然後填上必要的一些資訊,如Cron以及一些引數 具體配置可以參考
任務詳解[4] 這裡的配置項比較多。
配置完成後可以如下,可以手動執行,暫停,檢視日誌,如果是 Python 模式可以直接點選GLUE按鈕進去填寫程式碼,相關的程式碼也有版本回溯,方便回滾,十分方便。
小結
整個 XXL—JOB 都是支援分散式部署的,而且執行器也可以配置多個,具體的路由策略也是可以配置的,十分方便。新版本的排程中心 Admin 已經升級為 SpringBoot 專案了,而且專案本身就攜帶了很多型別的執行器可以使用,基本上實現了開箱即用,只要新增自己的業務邏輯就可以了。
不過整個 XXL-JOB 有個缺點就是沒有許可權管理,執行器沒有實現許可權控制,這個目前作者沒有實現,應該在後續的版本中會增加,這個在作者的 todo list 裡面,但是具體什麼時候實現就不知道了。目前我們這邊專案已經線上上跑了差不多一年了,還是比較穩定的,而且只是組內使用,沒有執行器許可權的問題,但是如果要是上升到公司級別,讓各個組用的話許可權還是一個重要的點。
Java 極客技術公眾號,是由一群熱愛 Java 開發的技術人組建成立,專注分享原創、高質量的 Java 文章。如果您覺得我們的文章還不錯,請幫忙讚賞、在看、轉發支援,鼓勵我們分享出更好的文章。
關注公眾號,大家可以在公眾號後臺回覆“部落格園”,免費獲得作者 Java 知識體系/面試必看資料。