天天看點

分布式任務排程解決方案XXL-JOB快速搭建教程

XXL-JOB是一個分布式任務排程平台,作為當下流行的分布式解決方案,其核心設計目标是開發迅速、學習簡單、輕量級、易擴充。它的有兩個核心子產品,一個子產品叫做排程中心,另外一個子產品叫做執行器,它把任務排程和任務執行分成兩個部分。本文從準備工作、搭建“排程中心”、搭建“執行器”三個步驟進行快速搭建。

XXL-JOB是一個分布式任務排程平台,其核心設計目标是開發迅速、學習簡單、輕量級、易擴充。現已開放源代碼并接入多家公司線上産品線,開箱即用。它的有兩個核心子產品,一個子產品叫做排程中心,另外一個子產品叫做執行器,它把任務排程和任務執行分成兩個部分。這樣排程子產品隻需要負責任務的排程屬性,觸發排程信号。執行子產品隻需要接收排程信号,去執行具體的業務邏輯,兩者可以各自的進行擴容和縮容。圖1是一張來自官方的架構圖。

既然是一個分布式排程平台,肯定會有一個排程中心,當然執行器(被排程者)也是必不可少的,可以參考架構圖。是以,使用xxl-job搭建一個demo,也必須有兩個端,下面本文分别從準備工作、搭建“排程中心”、搭建“執行器”三個部分進行說明。

源碼位址:https://github.com/xuxueli/xxl-job

我使用的源碼是2.2.0版本,這是目前最新的release版本。

源碼包含了文檔(資料庫初始化腳本、官方文檔、架構圖等)、排程中心源碼、核心core、各個版本的執行器源碼。如圖2所示:

2.1.2 資料庫準備

資料庫腳本在doc路徑下,将其執行之後可以建立一個資料庫,如圖3所示:

将資料庫連接配接資訊和報警資訊配置成自己的,配置檔案如下:

在IDEA裡面直接運作,如果使用的是macOS系統的話,可能會出現錯誤:Failed to create parent directories for [/data/applogs/xxl-job/xxl-job-admin.log],如圖4所示:

解決辦法是:将logback.xml中的“/data/applogs/xxl-job/xxl-job-admin.log”改為“./data/applogs/xxl-job/xxl-job-admin.log”,如圖5所示。後續在測試運作的時候,執行器端會抛出類似異常,用同樣的方式可以解決。

啟動之後浏覽器通路http://localhost:8080/xxl-job-admin,使用預設的使用者名(admin)和密碼(123456)登陸之後,可以看到如圖6所示頁面:

使用IDEA建立一個Spring Boot項目:xxl-job-executor

Maven依賴:

主要需要配置xxl-job的排程中心位址資訊、xxl-job執行器相關資訊。配置檔案如下:

還要建立一個XxlJobConfig.java配置執行器。代碼如下:

當然還要添加logback.xml檔案。

在Spring Bean執行個體中,開發Job方法,方式格式要求為 "public ReturnT execute(String param)"

為Job方法添加注解 "@XxlJob(value="自定義jobhandler名稱", init = "JobHandler初始化方法", destroy = "JobHandler銷毀方法")",注解value值對應的是排程中心建立任務的JobHandler屬性的值。之前的2.1.0版本中不支援在方法上面添加注解,需要在類上面添加@JobHandler注解,并繼承IJobHandler。

執行日志:需要通過 "XxlJobLogger.log" 列印執行日志;

代碼如下:

完成之後的整個代碼結構如圖8所示:

在本機運作排程中心和執行器。

在排程中心新增一個測試執行器,AppName為xxl-job-executor-test,名稱為測試執行器,注冊方式選擇自行注冊即可,如圖9所示:

新增一個任務,名稱與代碼中名稱一緻,配置為每2分鐘執行一次,路由政策為一緻性HASH,運作模式為BEAN,阻塞處理政策為單機串行,配置如圖10所示:

詳細配置屬性可以參考:

● 執行器:任務的綁定的執行器,任務觸發排程時将會自動發現注冊成功的執行器, 實作任務自動發現功能; 另一方面也可以友善的進行任務分組。每個任務必須綁定一個執行器, 可在 "執行器管理" 進行設定;

● 任務描述:任務的描述資訊,便于任務管理;

● 路由政策:當執行器叢集部署時,提供豐富的路由政策,包括;

FIRST(第一個):固定選擇第一個機器;

LAST(最後一個):固定選擇最後一個機器;

ROUND(輪詢):;

RANDOM(随機):随機選擇線上的機器;

CONSISTENT_HASH(一緻性HASH):每個任務按照Hash算法固定選擇某一台機器,且所有任務均勻散列在不同機器上。

LEAST_FREQUENTLY_USED(最不經常使用):使用頻率最低的機器優先被選舉;

LEAST_RECENTLY_USED(最近最久未使用):最久未使用的機器優先被選舉;

FAILOVER(故障轉移):按照順序依次進行心跳檢測,第一個心跳檢測成功的機器標明為目标執行器并發起排程;

BUSYOVER(忙碌轉移):按照順序依次進行空閑檢測,第一個空閑檢測成功的機器標明為目标執行器并發起排程;

SHARDING_BROADCAST(分片廣播):廣播觸發對應叢集中所有機器執行一次任務,同時系統自動傳遞分片參數;可根據分片參數開發分片任務;

● Cron:觸發任務執行的Cron表達式;

● 運作模式:

BEAN模式:任務以JobHandler方式維護在執行器端;需要結合 "JobHandler" 屬性比對執行器中任務;

GLUE模式(Java):任務以源碼方式維護在排程中心;該模式的任務實際上是一段繼承自IJobHandler的Java類代碼并 "groovy" 源碼方式維護,它在執行器項目中運作,可使用@Resource/@Autowire注入執行器裡中的其他服務;

GLUE模式(Shell):任務以源碼方式維護在排程中心;該模式的任務實際上是一段 "shell" 腳本;

GLUE模式(Python):任務以源碼方式維護在排程中心;該模式的任務實際上是一段 "python" 腳本;

GLUE模式(PHP):任務以源碼方式維護在排程中心;該模式的任務實際上是一段 "php" 腳本;

GLUE模式(NodeJS):任務以源碼方式維護在排程中心;該模式的任務實際上是一段 "nodejs" 腳本;

GLUE模式(PowerShell):任務以源碼方式維護在排程中心;該模式的任務實際上是一段 "PowerShell" 腳本;

● JobHandler:運作模式為 "BEAN模式" 時生效,對應執行器中新開發的JobHandler類“@JobHandler”注解自定義的value值;

● 阻塞處理政策:排程過于密集執行器來不及處理時的處理政策;

單機串行(預設):排程請求進入單機執行器後,排程請求進入FIFO隊列并以串行方式運作;

丢棄後續排程:排程請求進入單機執行器後,發現執行器存在運作的排程任務,本次請求将會被丢棄并标記為失敗;

覆寫之前排程:排程請求進入單機執行器後,發現執行器存在運作的排程任務,将會終止運作中的排程任務并清空隊列,然後運作本地排程任務;

● 子任務:每個任務都擁有一個唯一的任務ID(任務ID可以從任務清單擷取),當本任務執行結束并且執行成功時,将會觸發子任務ID所對應的任務的一次主動排程。

● 任務逾時時間:支援自定義任務逾時時間,任務運作逾時将會主動中斷任務;

● 失敗重試次數;支援自定義任務失敗重試次數,當任務失敗時将會按照預設的失敗重試次數主動進行重試;

● 報警郵件:任務排程失敗時郵件通知的郵箱位址,支援配置多郵箱位址,配置多個郵箱位址時用逗号分隔;

● 負責人:任務的負責人;

● 執行參數:任務執行所需的參數;

啟動排程任務,如圖11所示:

可以檢視日志或者控制台資訊,運作結果滿意,如圖12所示:

在控制台運作報表界面也可以看到排程和執行情況,如圖13所示。圖中那一次排程失敗是由于執行器重新開機,造成了排程中心排程任務的時候發現排程位址為空,是以執行失敗。

參考文檔:官方中文文檔

由于部落客也是在攀登的路上,文中可能存在不當之處,歡迎各位多指教! 如果文章對您有用,那麼請點個”推薦“,以資鼓勵!