本文詳細說明工作流程的配置方法,包含如何建立工作流程以及DAG編排的基本操作、節點介紹以及變數配置等,協助使用者高效完成自動化任務的配置與管理。
前提條件
升級XXL-Job引擎至3.0.0及以上版本。
建立工作流程
登入MSE XXL-JOB控制台,並在頂部功能表列選擇地區。
在左側導覽列,選擇。
單擊進入目標執行個體,在左側導覽列選擇,單擊建立工作流程,完成以下配置然後單擊確定完成工作流程建立。
配置項分類
配置項
描述
預設值
基本配置
工作流程名稱
同一個應用下工作流程名稱需保持唯一。
應用ID
該工作流程相關 App。
時間類型
cron:使用cron運算式周期性調度。
api:通過openapi調度。
cron
cron運算式
定時任務時間運算式,支援使用產生工具進行編輯。
0 0 12 * * ?
進階配置
時區
定時任務執行依賴的時區。
PRC
日曆
工作流程按照指定日曆調度,預設為每天調度。
最大並發數
同一個工作流程同一時間允許啟動並執行最大執行個體個數,1表示不允許重複執行。如果超過並發數,將跳過當前調度。
1
DAG編排
DAG編排提供可視化畫布,支援通過拖拽節點配置任務依賴關係,並可利用邏輯節點實現複雜工作流程的處理。
基本操作
工作流程建立完成後,單擊操作列DAG進入工作流程編輯畫布。
從左側功能表列拖拽任務至畫布,完成節點建立。
將滑鼠移至上方於節點右側或下側,出現“+”表徵圖後,拖拽至另一節點的左側或上側,建立依賴關係。
選中節點或連線後單擊滑鼠右鍵,可移除對應元素。
通過滑鼠左鍵雙擊節點,或右鍵點擊節點後選擇編輯,可修改節點配置資訊。
若節點為任務節點,右鍵點擊節點並選擇編輯指令碼,可修改該節點的指令碼內容。
單擊儲存新版本並輸入版本名稱後可儲存當前工作流程的變更。
指定機器:如果應用接入多個執行器,可指定任務節點啟動並執行執行器。
任務節點
任務節點參數說明
邏輯節點
狀態分支
對標DolphinScheduler的Conditions節點。根據上遊節點的狀態動態選擇下遊執行分支,未被選中的分支將被標記為已跳過,支援多上遊節點與多下遊節點的複雜依賴關係。
在工作流程畫布中增加一個狀態分支節點。

配置狀態分支。

如上圖所示的配置,節點將執行以下邏輯。
if ((armon-job31==success || armon-job32==success) && armon-job33==success ) switch to armon-job34 else switch to armon-job35
條件分支
對標DolphinScheduler的Switch節點。使用javax.script.ScriptEngine.eval執行運算式,下遊分支的執行路徑由上遊節點返回的自訂變數或輸出結果決定,未被選中的分支將被標記為跳過狀態,支援多個上遊節點與多個下遊節點的動態分支配置。
在工作流程畫布中增加一個條件分支節點

為armon-job41任務增加一個自訂輸出變數
var1。
編輯armon-job41的指令碼,輸出
var1變數為world。
配置armon-condition-1邏輯節點如下

工作流程執行結果
上遊任務節點輸出為world並通過自訂變數
var1傳遞至後續節點。雖然armon-condition-1節點預設分支流轉至armon-job44節點,但因接收到變數var1後執行ELIF邏輯,將執行armon-job43任務節點。
外部依賴
對標DolphinScheduler的Dependent節點。當一個流程太大時,可以拆成多個小流程,提取出一個公用的流程C,A流程和B流程均可依賴C流程。
以如下配置為例,後續任務節點執行需要依賴DependentTest應用下DependentTestFlow工作流程的DependentTestFlowJob任務節點在當天19:00:00至20:00:00時間內的最後一次執行結果成功。
如果依賴的工作流程對應任務在規定時間內未執行完成或任務執行失敗,即使其他前置依賴已經滿足,後續節點仍不可執行。

時間周期說明
時間周期 | 取值 | 時間範圍 |
日 |
| 若被依賴任務在一天內調度多次,可指定依賴當天特定時間段的資料。 若該時間段記憶體在多個任務執行個體,則預設依賴該時間段內最後一次執行的執行個體。 |
周 |
| 如果被依賴任務在周內某天調度多次,可指定依賴當天哪個時間段的資料;該時間段內若有多個任務執行個體,則依賴最後一次。 |
月 |
| 如果被依賴任務在月內某天調度多次,可指定依賴當天哪個時間段的資料;該時間段內若有多個任務執行個體,則依賴最後一次。 |
人工節點
人工節點一旦開始運行就將進入掛起(Held) 狀態,需要人工確認通過才能變成成功狀態,繼續後續的任務執行。
以下圖為例,data-process任務前置節點包含人工節點,當data-import節點執行完畢後仍需等待manual-check節點的確認結果才可執行。

變數
系統變數
變數 | 描述 | 樣本 |
system.schedule.time | 調度時間, yyyyMMddHHmmss格式 | 20251212023000 |
system.data.time | 資料時間, yyyyMMddHHmmss格式 | 20251212023000 |
system.bizdate | 資料時間精確到天,yyyyMMdd | 20251212 |
system.task.definition.name | 任務名稱 | myTask1 |
system.task.instance.id | 任務執行個體id | 1448366263490740225 |
system.workflow.definition.name | 工作流程名稱 | myWorkflow1 |
system.workflow.instance.id | 工作流程執行個體id | 100 |
自訂變數
工作流程中所有任務節點均可自訂變數,分為IN和OUT兩種類型。
IN:作為任務節點的輸入變數,當前節點指令碼可直接使用該變數的值。
OUT:如果下遊節點需要依賴上遊節點輸出的結果,可通過OUT類型變數進行參數傳遞。
變數值的大小不能超過64KB。
OUT類型變數將對節點整個下遊生效,不局限於下一節點。
舉例說明:
在任務定義中配置如下指令碼。
#!/bin/bash echo "xxl-job: hello shell" # system variables echo "System schedule time (yyyyMMddHHmmss): ${system.schedule.time}" echo "System data time (yyyyMMddHHmmss): ${system.data.time}" echo "System data date(yyyyMMdd): ${system.biz.curdate}" echo "Task Definition Name: ${system.task.definition.name}" echo "Task Instance ID: ${system.task.instance.id}" echo "Workflow Definition Name: ${system.workflow.definition.name}" echo "Workflow Instance ID: ${system.workflow.instance.id}" # custom variables echo "#{setValue(var1=hello)}" echo "#{setValue(var2=world)}" # custom output sum=0 for ((i=1; i<=100; i++)) do echo "hello world $i" sum=$((sum + i)) done echo "#{setResult($sum)}" exit 0在自訂參數中添加兩個OUT型別參數。

此時指令碼最終任務結果為5050,並且在執行過程中為
var1和var2分別賦值為hello和world,通過步驟2的自訂參數配置,可將var1和var2作為變數向下遊傳遞,如果未設定自訂參數,var1和var2的賦值僅在此任務節點中生效。
可參考條件分支,其中條件節點的輸入參數是上一任務節點通過自訂變數傳遞的結果。
Demo
Shell Demo
#!/bin/bash
echo "xxl-job: hello shell"
# system variables
echo "System schedule time (yyyyMMddHHmmss): ${system.schedule.time}"
echo "System data time (yyyyMMddHHmmss): ${system.data.time}"
echo "System data date(yyyyMMdd): ${system.biz.curdate}"
echo "Task Definition Name: ${system.task.definition.name}"
echo "Task Instance ID: ${system.task.instance.id}"
echo "Workflow Definition Name: ${system.workflow.definition.name}"
echo "Workflow Instance ID: ${system.workflow.instance.id}"
# custom variables
echo "#{setValue(var1=hello)}"
echo "#{setValue(var2=world)}"
# custom output
sum=0
for ((i=1; i<=100; i++))
do
echo "hello world $i"
sum=$((sum + i))
done
echo "#{setResult($sum)}"
exit 0匯出工作流程
在流程管理頁面,選中目標工作流程,單擊匯出工作流程。可以同時匯出多個工作流程。
工作流程匯出格式說明
匯出格式為JSON格式,總體結構包括工作流程類型、匯出格式、功能版本,以及匯出的工作流程列表。
其中工作流程列表中的每一項對應一個工作流程對象,工作流程對象包括工作流程的定義資訊、節點列表、邊列表。
[
"kind": "SchedulerXWorkflows", // 類型
"type": "JSON", // 匯出格式
"version": "2.0", // 功能版本
"content": [ // 工作流程列表
{
"workflowInfo": {}, // 定義資訊
"nodes": [], // 節點列表
"edges": [] // 邊列表
},
{...}
],
]欄位 | 含義 |
kind | 工作流程類型 |
type | 匯出格式 |
version | 功能版本 |
content | 工作流程列表 |
(content) workflowInfo | 定義資訊 |
(content) nodes | 節點列表 |
(content) edges | 邊列表 |
工作流程匯出結果樣本
以下圖工作流程為例,匯出具體欄位展示如下:
下圖中的Schedulerx-Root 是系統內建的唯一根節點,節點ID為0(使用者無需手動建立)

{
"kind": "SchedulerXWorkflows",
"type": "JSON",
"version": "2.0",
"content": [
{
"workflowInfo": {
"appName": "qiacheng-import-test",
"appType": 1,
"name": "qiacheng-success",
"description": "qiacheng-success",
"currentExecuteStatus": 0,
"timeConfig": {
"calendar": "workday",
"dataOffset": 0,
"timezone": "Hongkong",
"timeType": 1,
"paramMap": {},
"timeExpression": "0 0 12 * * ?"
},
"version": "v1.0",
"maxConcurrency": 1,
"status": 0,
"creator": "xxxxx",
"updater": "xxxxx"
},
"nodes": [
{
"name": "script-job1",
"description": "script-job1",
"jobType": "script_shell",
"executeMode": "standalone",
"attemptInterval": 30,
"startTimeType": 1,
"startTime": -1,
"weight": 1,
"routeStrategy": 1,
"priority": 5,
"contentType": 2,
"content": "#!/bin/bash\n# system variables\necho \"System schedule time (yyyyMMddHHmmss): ${system.schedule.time}\"\necho \"System data time (yyyyMMddHHmmss): ${system.data.time}\"\necho \"System data date(yyyyMMdd): ${system.biz.curdate}\"\necho \"Task Definition Name: ${system.task.definition.name}\"\necho \"Task Instance ID: ${system.task.instance.id}\"\necho \"Workflow Definition Name: ${system.workflow.definition.name}\"\necho \"Workflow Instance ID: ${system.workflow.instance.id}\"\n\n# custom variables\necho \"#{setValue(var1=hello)}\"\necho \"#{setValue(var2=world)}\"\n\n# task process\nsum=0\nfor ((i=1; i<=100; i++))\ndo\n echo \"hello world $i\"\n sum=$((sum + i))\ndone\n\n# custom output result\necho \"#{setResult($sum)}\"\n\n# Returns 0 on success, otherwise returns an error code\nexit 0",
"maxConcurrency": 1,
"maxAttempt": 0,
"xattrs": "{\"executorBlockStrategy\":1}",
"parameters": "",
"timeConfig": {
"calendar": "",
"dataOffset": 0,
"paramMap": {},
"timeType": -1,
"timeExpression": ""
},
"monitorConfigInfo": {
"endEarlyEnable": false,
"failLimitTimes": 1,
"failEnable": true,
"failRate": 100,
"timeoutKillEnable": false,
"endEarly": 30,
"sendChannel": "",
"timeout": 300,
"daysOfDeadline": 0,
"alarmType": "CustomContacts",
"missWorkerEnable": true,
"timeoutEnable": true,
"successNotice": false
},
"contactInfoList": [],
"coordinate": {
"x": -176,
"y": 357
},
"dependentStrategy": 1,
"status": 1
},
{
"name": "script-job2",
// 類似
},
{
"name": "script-job3",
// 類似
},
{
"name": "script-job4",
// 類似
},
{
"name": "condition_branch",
// 類似
}
],
"edges": [
{
"from": "Schedulerx-Root",
"to": "script-job2"
},
{
"from": "Schedulerx-Root",
"to": "script-job1"
},
{
"from": "script-job1",
"to": "condition_branch"
},
{
"from": "script-job2",
"to": "condition_branch"
},
{
"from": "condition_branch",
"to": "script-job4"
},
{
"from": "condition_branch",
"to": "script-job3"
}
],
"kind": "SchedulerXWorkflows",
}
]
}匯入工作流程
在流程管理頁面,單擊匯入工作流程。在選擇檔案地區,上傳工作流程JSON檔案。如果已經存在相同工作流程,匯入時可以選擇覆蓋或跳過。
匯入時若不存在指定的應用,則會自動建立應用。
系統按照執行個體規格,檢測工作流程和任務數(例如:專業版小規格x1,支援最大任務數100,最大工作流程數20),若超過則提示匯入失敗。
匯入格式與匯出格式一致,具體可見匯出部分說明。