背景
日常開發中,我們難免會遇到需要處理一些定時任務,而且這些定時任務還需要靈活的調度,並且在異常的情況下需要做的重試或者報警。這些任務我們希望能靈活配置,並且能及時生效,不需要經常發版本更新代碼。所以我們希望能有一個這樣的平台,能滿足我們的這些需求。感謝開源社區,已經有了很好的解決方案,就是 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 {@Overridepublic ReturnT<String> execute(String s) throws Exception {XxlJobLogger.log("日志記錄數據...");//do somethingreturn ReturnT.SUCCESS;}}
新增任務
配置好調度中心並且也成功啟動了執行器后,登錄調度中心新增執行器然后就可以配置任務了
新增執行器

新增任務
新增任務的時候需要選擇上一步創建的執行器,選擇運行模式,如果是 JavaBean 方式就配置 JobHandler,或者選擇 Python 模式等,然后填上必要的一些信息,如Cron以及一些參數 具體配置可以參考
任務詳解[4] 這里的配置項比較多。
配置完成后可以如下,可以手動執行,暫停,查看日志,如果是 Python 模式可以直接點擊GLUE按鈕進去填寫代碼,相關的代碼也有版本回溯,方便回滾,十分方便。

小結
整個 XXL—JOB 都是支持分布式部署的,而且執行器也可以配置多個,具體的路由策略也是可以配置的,十分方便。新版本的調度中心 Admin 已經升級為 SpringBoot 項目了,而且項目本身就攜帶了很多類型的執行器可以使用,基本上實現了開箱即用,只要添加自己的業務邏輯就可以了。
不過整個 XXL-JOB 有個缺點就是沒有權限管理,執行器沒有實現權限控制,這個目前作者沒有實現,應該在后續的版本中會增加,這個在作者的 todo list 里面,但是具體什么時候實現就不知道了。目前我們這邊項目已經在線上跑了差不多一年了,還是比較穩定的,而且只是組內使用,沒有執行器權限的問題,但是如果要是上升到公司級別,讓各個組用的話權限還是一個重要的點。
Java 極客技術公眾號,是由一群熱愛 Java 開發的技術人組建成立,專注分享原創、高質量的 Java 文章。如果您覺得我們的文章還不錯,請幫忙贊賞、在看、轉發支持,鼓勵我們分享出更好的文章。
關注公眾號,大家可以在公眾號后台回復“博客園”,免費獲得作者 Java 知識體系/面試必看資料。

