提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 可視化界面
- 1 新增執行器
- 2.新增任務
- **執行器**:
- **任務描述**:
- **路由策略**:
- **Cron**:
- cron表達式
- **運行模式**
- JobHandler
- 子任務:
- 阻塞處理策略:
- 任務參數:
- 報警郵件:
- 負責人:
- 3. BEAN模式任務
- 4.GLUE(Java)模式任務,
- 5.分片廣播任務
- 6.任務管理
- 7.任務調度日志
- 1.查看調度日志
- 2.查看執行日志
- 3.終止運行中的任務
- 4.刪除執行日志
- 8 執行失敗報警
可視化界面
1 新增執行器
新增執行器時,需要填寫的信息,如下所示:
-
AppName:這是用來唯一標識每個執行器集群的應用名稱,執行器會周期性地以AppName為參數進行自動注冊。可通過該配置自動發現注冊成功的執行器,供任務調度時使用。
-
名稱:執行器的名稱,因為AppName限制字母數字等組成,可讀性不強,名稱可以提高執行器的可讀性。
-
排序:執行器的排序,系統中需要執行器的地方,如任務新增,將會按照該排序讀取可用的執行器列表。
-
注冊方式:調度中心獲取執行器地址的方式,有以下兩種:
-
自動注冊:執行器自動進行執行器注冊,調度中心通過底層注冊表可以動態發現執行器機器地址。
-
手動錄入:人工手動錄入執行器的地址信息,多地址逗號分隔,供調度中心使用。
-
機器地址:只有在“注冊方式”為“手動錄入”時可編輯,支持人工維護執行器的地址信息。
注意,AppName的取值應該和示例工程的application.properties文件中的xxl.job.executor.appname字段的取值相同,注冊方式應該選擇自動注冊。新增完成之后,就可以在執行器列表中看到新建的執行器, 而我在寫入的時候將applcation.properties替換為了bootstrap.yml,但內容不變;
2.新增任務
執行器:
- 任務綁定的執行器,任務觸發調度時將會自動發現注冊成功的執行器,實現任務自動發現功能;另一方面,也可以方便地進行任務分組。每個任務必須綁定一個執行器,可以在“執行器管理”頁面進行設置。
任務描述:
- 任務的描述信息,便于任務管理。
路由策略:
- 當執行器集群部署時,提供豐富的路由策略,包括:
策略 | 參數值 | 詳細含義 |
---|---|---|
第一個 | FIRST | 固定選擇第一個機器 |
最后一個 | LAST | 固定選擇最后一個機器 |
輪詢 | ROUND | 依次選擇執行 |
隨機 | RANDOM | 隨機選擇在線的機器 |
一致性HASH | CONSISTENT_HASH | 每個任務按照Hash算法固定選擇某一臺機器,且所有任務均勻散列在不同機器上 |
最不經常使用 | LEAST_FREQUENTLY_USED | 使用頻率最低的機器優先被選舉 |
最近最久未使用 | LEAST_RECENTLY_USED | 最久未使用的機器優先被選舉 |
故障轉移 | FAILOVER | 按照順序依次進行心跳檢測,第一個心跳檢測成功的機器選定為目標執行器并發起調度 |
忙碌轉移 | BUSYOVER | 按照順序依次進行空閑檢測,第一個空閑檢測成功的機器選定為目標執行器并發起調度 |
分片廣播 | SHARDING_BROADCAST | 廣播觸發對應集群中所有機器執行一次任務,同時系統自動傳遞分片參數;可根據分片參數開發分片任務 |
Cron:
觸發任務執行的Cron表達式,
cron表達式
運行模式
-
BEAN模式:任務以JobHandler的方式維護在執行器端;需要結合 “JobHandler”屬性匹配執行器中的任務;
-
GLUE模式(Java):任務以源碼方式維護在調度中心;該模式的任務實際上是一段繼承自IJobHandler的Java類代碼并以“groovy”源碼的方式維護,它在執行器項目中運行,可使用@Resource/@Autowire注入執行器里中的其他服務;
-
GLUE模式(Shell):任務以源碼方式維護在調度中心;該模式的任務實際上是一段“shell”腳本;
-
GLUE模式(Python):任務以源碼方式維護在調度中心;該模式的任務實際上是一段“python”腳本;
-
GLUE模式(NodeJS):任務以源碼方式維護在調度中心;該模式的任務實際上是一段“nodejs”腳本;
JobHandler
- 只有在運行模式為“BEAN模式”時生效,對應執行器中新開發的JobHandler類的“@JobHandler”注解自定義的value值。
子任務:
- 每個任務都擁有一個唯一的任務ID(任務ID可以從任務列表獲取),當本任務執行結束并且執行成功時,將會觸發子任務ID所對應的任務的一次主動調度。
阻塞處理策略:
調度過于密集,執行器來不及處理時的處理策略:
- 失敗告警(默認):調度失敗和執行失敗時,都將會觸發失敗報警,默認會發送報警郵件。
- 失敗重試:調度失敗時,除了進行失敗告警之外,將會自動重試一次;注意在執行失敗時不會重試,而是根據回調返回值判斷是否重試。
策略 | 參數值 | 詳細含義 |
---|---|---|
單機串行,默認 | SERIAL_EXECUTION | 調度請求進入單機執行器后,調度請求進入FIFO隊列并以串行方式運行 |
丟棄后續調度 | DISCARD_LATER | 調度請求進入單機執行器后,發現執行器存在運行的調度任務,本次請求將會被丟棄并標記為失敗 |
覆蓋之前調度 | COVER_EARLY | 調度請求進入單機執行器后,發現執行器存在運行的調度任務,將會終止運行中的調度任務并清空隊列,然后運行本地調度任務 |
任務參數:
- 任務執行所需的參數,多個參數時用逗號分隔,任務執行時將會把多個參數轉換成數組傳入。
報警郵件:
- 任務調度失敗時郵件通知的郵箱地址,支持配置多郵箱地址,配置多個郵箱地址時用逗號分隔。
負責人:
- 任務的負責人。
3. BEAN模式任務
任務邏輯以JobHandler的形式存在于“執行器”所在項目中,如我們剛剛所演示的Hello,World 的入門案例
上述代碼有三點需要注意:
- 必須使用XXL-JOB的@JobHandler注解(第1行),指定JobHandler的名稱為“demoJobHandler”,在調度中心新建任務的JobHandler字段的取值要與此相同。
- 必須繼承IJobHandler抽象類(第3行),并且實現它的execute()方法,這是實現任務邏輯的方法。
- IJobHandler抽象類還有init()方法和destroy()方法,這兩個方法是空方法,在任務實例初始化和銷毀時調用,任務實現類可以選擇性地覆蓋這兩個方法。
4.GLUE(Java)模式任務,
任務以源碼方式維護在調度中心,支持通過Web IDE在線更新,實時編譯和生效,因此不需要指定JobHandler。開發流程如下:
Step-1 新建調度任務
- 參考上文“任務調度屬性”對新建的任務進行參數配置,運行模式選擇“GLUE模式(Java)”,如下圖所示
調度中心會每隔15分鐘調度一次這個任務。
Step-2 開發任務代碼
- 在任務列表中選中指定的GLUE(Java)任務,點擊該任務右側的“GLUE”按鈕,將會前往GLUE任務的Web
IDE界面,在該界面支持對任務代碼進行開發(也可以在IDE中開發完成后,復制粘貼到編輯中)。 - 版本回溯功能:在GLUE任務的Web IDE界面,選擇右上角下拉框“版本回溯”,會列出該GLUE任務的更新歷史(支持30個版本的版本回溯),選擇相應版本即可顯示該版本代碼,保存后GLUE代碼即回退到對應的歷史版本。GLUE任務代碼和Web IDE界面,如下圖所示:
5.分片廣播任務
執行器集群部署時,任務路由策略選擇“分片廣播”的情況下,一次任務調度將會廣播觸發對應集群中所有執行器執行一次任務,同時傳遞分片參數,可以根據分片參數開發分片任務。
- “分片廣播”以執行器為維度進行分片,支持動態擴容執行器集群從而動態增加分片數量,協同進行業務處理;在進行大數據量業務操作時可顯著提升任務處理能力和速度。
- “分片廣播”和普通任務開發流程一致,不同之處在于可以獲取分片參數,通過分片參數進行分片業務處理。開發流程如下:
Step-1 開發JobHandler代碼
在示例工程的com.example.demo.jobhandler包中,新建ShardingJobHandler任務類,關鍵代碼如下所示:
@JobHandler(value="shardingJobHandler")
@Service
public class ShardingJobHandler extends IJobHandler {@Overridepublic ReturnT<String> execute(String param) throws Exception {// 分片參數ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();XxlJobLogger.log("分片參數:當前分片序號 = {0}, 總分片數 = {1}", shardingVO.getIndex(), shardingVO.getTotal());// 業務邏輯for (int i = 0; i < shardingVO.getTotal(); i++) {if (i == shardingVO.getIndex()) {XxlJobLogger.log("第 {0} 片, 命中分片開始處理", i);} else {XxlJobLogger.log("第 {0} 片, 忽略", i);}}return SUCCESS;}
}
上述代碼的第9行獲取分片參數,第10行獲取分片參數的兩個屬性:
- shardingVO.getIndex() 當前分片序號(從0開始),執行器集群列表中當前執行器的序號。
- shardingVO.getTotal() 總分片數,執行器集群的總機器數量。
Step-2 新建調度任務
參考上文“任務調度屬性”對新建的任務進行參數配置,運行模式選擇“BEAN模式”,路由策略選擇“分片廣播”,JobHandler屬性填寫任務注解@JobHandler中定義的值,如下圖所示:
調度中心會每隔15分鐘廣播調度一次shardingJobHandler任務(因為Corn表達式設置了15分鐘執行一次)。
分片廣播的路由策略不僅適用于BEAN運行模式,而且也適用于GLUE(Java)運行模式。這項功能適用于以下業務場景:
- 分片任務場景
10個執行器的集群來處理10w條數據,每臺機器只需要處理1w條數據,耗時降低10倍。 - 廣播任務場景
廣播執行器機器運行shell腳本、廣播集群節點進行緩存更新等。
6.任務管理
在任務列表中,可以看到每個任務的任務ID、任務描述、運行模式、Cron、負責人和狀態等信息。用戶可以對任務進行以下幾種操作:
-
執行:手動觸發一次任務調度,不影響原有調度規則。
-
暫停/恢復:可對任務進行“暫停”和“恢復”操作。需要注意的是,此處的暫停/恢復僅針對任務的后續調度觸發行為,不會影響到已經觸發的調度任務。
-
日志:可以查看任務歷史調度日志。在歷史調入日志界面可查看每次任務調度的調度結果、執行結果等,點擊“執行日志”按鈕可查看執行器完整日志。
-
編輯:在彈出的“編輯任務”界面更新任務屬性后保存即可,可以修改設置的任務屬性信息。
-
GLUE:該操作僅針對GLUE任務。將會前往GLUE任務的Web IDE界面,在該界面支持對任務代碼進行開發。
-
刪除:刪除這個任務。
7.任務調度日志
- 在XXL-JOB調度中心,點擊進入“調度日志”頁面。
1.查看調度日志
在“調度日志”頁面可以查看每次任務調度的調度結果、執行結果等信息,
從調度日志可以獲取以下信息:
-
調度時間:“調度中心”觸發本次調度并向“執行器”發送任務執行信號的時間。
-
調度結果:“調度中心”觸發本次調度的結果,200表示成功,500或其他表示失敗。
-
調度備注:“調度中心”觸發本次調度的日志信息。
-
執行時間:“執行器”中本次任務執行結束后回調的時間。
-
執行結果:“執行器”中本次任務執行的結果,200表示成功,500或其他表示失敗。
-
執行備注:“執行器”中本次任務執行的日志信息。
在示例工程中,調度日志位于/data/applogs/xxl-job/xxl-job-demo.log,可以在logback.xml文件中進行配置。
2.查看執行日志
點擊某行日志右側的 “執行日志” 按鈕,可跳轉至執行日志界面,可以查看業務代碼中打印的完整日志,如下圖:
3.終止運行中的任務
這項功能只針對執行中的任務。在任務日志頁面,點擊右側的“終止任務”按鈕,將會向本次任務對應的執行器發送任務終止請求,將會終止掉本次任務,同時會清空掉整個任務執行隊列,如下圖所示
- 任務終止是通過“interrupt”執行線程的方式實現的,將會觸發“InterruptedException”異常。因此,如果JobHandler內部捕獲到該異常并消化掉的話,任務終止功能將不起作用。
- 因此, 如果遇到上述任務終止不起作用的情況,需要在JobHandler中針對“InterruptedException”異常進行特殊處理(向上拋出)。另外,在JobHandler中開啟子線程時,子線程也不可捕獲處理“InterruptedException”,應該主動向上拋出。
4.刪除執行日志
在任務日志頁面,選擇執行器和任務之后,點擊右側的“清理”按鈕將會出現“日志清理”彈框,彈框中支持選擇不同類型的日志清理策略,選中后點擊“確定”按鈕即可進行日志清理操作,如下圖所示:
8 執行失敗報警
概述: 當定時任務執行失敗的時候,日志會自動記錄失敗結果,并且在cdmtc.xxl-job里面的application.properties中配置了email郵箱時,可郵件提醒;
效果演示:
每一次執行失敗均可提醒
開啟短信提醒功能,需要從郵箱中獲取授權碼,每個郵箱的獲取方式可能不同,可具體百度;qq郵箱為從 設置 按鈕中的 賬戶 ,然后選擇POP3/SMTP 服務,點擊開啟,按提示獲取授權碼即可;
獲取授權碼圖示:
授權碼就是配置文件中的password