全部產品
Search
文件中心

Microservices Engine:流程管理

更新時間:Feb 04, 2026

本文詳細說明工作流程的配置方法,包含如何建立工作流程以及DAG編排的基本操作、節點介紹以及變數配置等,協助使用者高效完成自動化任務的配置與管理。

前提條件

建立XXL-Job執行個體

升級XXL-Job引擎至3.0.0及以上版本。

建立工作流程

  1. 登入MSE XXL-JOB控制台,並在頂部功能表列選擇地區。

  2. 在左側導覽列,選擇任務調度 > XXL-JOB版

  3. 單擊進入目標執行個體,在左側導覽列選擇工作流程 > 流程管理,單擊建立工作流程,完成以下配置然後單擊確定完成工作流程建立。

    配置項分類

    配置項

    描述

    預設值

    基本配置

    工作流程名稱

    同一個應用下工作流程名稱需保持唯一。

    應用ID

    該工作流程相關 App。

    時間類型

    • cron:使用cron運算式周期性調度。

    • api:通過openapi調度。

    cron

    cron運算式

    定時任務時間運算式,支援使用產生工具進行編輯。

    0 0 12 * * ?

    進階配置

    時區

    定時任務執行依賴的時區。

    PRC

    日曆

    工作流程按照指定日曆調度,預設為每天調度。

    最大並發數

    同一個工作流程同一時間允許啟動並執行最大執行個體個數,1表示不允許重複執行。如果超過並發數,將跳過當前調度。

    1

DAG編排

DAG編排提供可視化畫布,支援通過拖拽節點配置任務依賴關係,並可利用邏輯節點實現複雜工作流程的處理。

基本操作

  1. 工作流程建立完成後,單擊操作DAG進入工作流程編輯畫布。

  2. 從左側功能表列拖拽任務至畫布,完成節點建立。

  3. 將滑鼠移至上方於節點右側或下側,出現“+”表徵圖後,拖拽至另一節點的左側或上側,建立依賴關係。

  4. 選中節點或連線後單擊滑鼠右鍵,可移除對應元素。

  5. 通過滑鼠左鍵雙擊節點,或右鍵點擊節點後選擇編輯,可修改節點配置資訊。

  6. 若節點為任務節點,右鍵點擊節點並選擇編輯指令碼,可修改該節點的指令碼內容。

  7. 單擊儲存新版本並輸入版本名稱後可儲存當前工作流程的變更。

  8. 指定機器:如果應用接入多個執行器,可指定任務節點啟動並執行執行器。

任務節點

任務節點參數說明

配置項分類

配置項

描述

預設值

基本配置

任務名稱

同一個應用下任務名稱需保持唯一。

任務類型

  • Shell:Unix Shell 指令碼

  • Python:Python 指令碼

  • PHP:PHP 指令碼

  • NodeJs:Node.js 指令碼

  • Cmd:Windows CMD 命令

  • BEAN:XXL-JOB BEAN

  • HTTP:發起HTTP請求,無需部署執行器

  • Dify:調用Dify工作流程工作

路由策略

  • 輪詢

  • 一致性雜湊

  • 權重最小

  • 分區廣播

  • 隨機

  • 第一個

  • 最後一個

  • 最不經常使用

  • 最近最久未使用

輪詢

堵塞處理策略

當該任務在該執行器上一次運行尚未完成,如何處理新派發的任務。

  • 單機串列:任務在隊列中等待,待前一任務完成後依次執行。

  • 丟棄後續調度:新任務將被丟棄,不予執行。

  • 覆蓋之前調度:丟棄前一任務,立即執行新任務。

單機串列

依賴檢查策略

  • all_success:上遊全部成功或跳過

  • all_failed:上遊全部失敗

  • all_done:上遊全部完成(成功、失敗、跳過)

  • all_done_min_one_success:全部完成並且至少一個成功

  • one_failed:上遊至少一個失敗

  • one_success:上遊至少一個成功

  • one_done:上遊至少一個完成

all_success

優先順序

任務的優先順序,需要配合任務隊列使用。

任務權重

任務的權重,需要配合權重最小路由策略使用。

1

失敗重試次數

失敗重試的最大次數。

0

失敗稍候再試

失敗重試的間隔,單位為秒。

30

任務並發數

同一個任務同一時間允許啟動並執行最大執行個體個數,1表示不允許重複執行。如果超過並發數,會跳過當前調度。

1

自訂變數

在指令碼之外為節點定義的輸入/輸出變數,更多詳情可參考自訂變數

定時配置

時區

該任務節點定時執行時依賴的時區。

日曆

當工作流程執行至該任務節點時,若目前時間未達到節點配置的日曆時間,則該任務節點將不會執行。

開始時間

任務節點開始生效執行的時間。

  • 立即生效:該任務節點在上遊節點完成後立即執行。

  • 指定開始時間:該任務節點在指定時間開始運行,即使上遊節點已經完成。

    • 未來某時刻:在未來指定的日期時間滿足後啟動執行。

    • 每天:每天到達指定時間才開始運行。

    • 每小時:每小時內到達指定時間才開始運行。

    • 延時:當上遊節點完成後延遲一段時間後執行,單位為秒。

立即生效

通知配置

逾時警示

任務運行超過設定的閾值則警示。

開啟

逾時時間

開啟逾時警示時需配置逾時時間,單位為秒。

300

逾時停止

開啟逾時警示時可配置逾時停止時間,任務運行超過指定時間自動終止。

關閉

成功通知

任務執行成功會通過配置的渠道推送給連絡人,10分鐘內最多推送一次。

關閉

失敗警示

開啟後當任務節點失敗將進行警示。

開啟

連續失敗次數

失敗次數達到連續失敗次數後才會警示。

無可用機器警示

開啟後如果任務沒有可用機器,不會產生調度記錄,只會進行警示。

關閉後如果任務沒有可用機器,將產生一條失敗的調度記錄。

開啟

提前結束警示

任務已耗用時間小於設定的閾值則警示。

關閉

通知方式

支援簡訊、webhook、郵件、電話。支援多選。

通知對象

可添加使用CloudMonitor連絡人或連絡人群組。

邏輯節點

狀態分支

對標DolphinScheduler的Conditions節點。根據上遊節點的狀態動態選擇下遊執行分支,未被選中的分支將被標記為已跳過,支援多上遊節點與多下遊節點的複雜依賴關係。

  1. 在工作流程畫布中增加一個狀態分支節點。

    image.png

  2. 配置狀態分支。

    image

  3. 如上圖所示的配置,節點將執行以下邏輯。

    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執行運算式,下遊分支的執行路徑由上遊節點返回的自訂變數或輸出結果決定,未被選中的分支將被標記為跳過狀態,支援多個上遊節點與多個下遊節點的動態分支配置。

  1. 在工作流程畫布中增加一個條件分支節點

    image.png

  2. 為armon-job41任務增加一個自訂輸出變數var1

    image

  3. 編輯armon-job41的指令碼,輸出var1變數為world

    image

  4. 配置armon-condition-1邏輯節點如下

    image

  5. 工作流程執行結果

    上遊任務節點輸出為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時間內的最後一次執行結果成功

    如果依賴的工作流程對應任務在規定時間內未執行完成或任務執行失敗,即使其他前置依賴已經滿足,後續節點仍不可執行。

    image

    時間周期說明

    時間周期

    取值

    時間範圍

    • 今天:依賴另一個任務當天的資料。

    • 昨天:依賴另一個任務昨天的資料。

    • 前天(T-2):依賴另一個任務T-2天的資料。

    • 前三天(T-3):依賴另一個任務T-3天的資料。

    • 前七天(T-7):依賴另一個任務T-7天的資料。

    若被依賴任務在一天內調度多次,可指定依賴當天特定時間段的資料。

    若該時間段記憶體在多個任務執行個體,則預設依賴該時間段內最後一次執行的執行個體。

    • 本周:依賴另一個任務本周的資料(本周一至今天)

    • 上周:依賴另一個任務上周的資料(上周一至上周日)

    • 上周一:依賴另一個任務上周一的資料

    • 上周二:依賴另一個任務上周二的資料

    • 上周三:依賴另一個任務上周三的資料

    • 上周四:依賴另一個任務上周四的資料

    • 上周五:依賴另一個任務上周五的資料

    • 上周六:依賴另一個任務上周六的資料

    • 上周日:依賴另一個任務上周日的資料

    如果被依賴任務在周內某天調度多次,可指定依賴當天哪個時間段的資料;該時間段內若有多個任務執行個體,則依賴最後一次。

    • 本月:依賴另一個任務本月的資料(本月 1 號至今天)

    • 上月:依賴另一個任務上月的資料(上月 1 號至上月最後一天)

    如果被依賴任務在月內某天調度多次,可指定依賴當天哪個時間段的資料;該時間段內若有多個任務執行個體,則依賴最後一次。

    人工節點

    人工節點一旦開始運行就將進入掛起(Held) 狀態,需要人工確認通過才能變成成功狀態,繼續後續的任務執行。

    以下圖為例,data-process任務前置節點包含人工節點,當data-import節點執行完畢後仍需等待manual-check節點的確認結果才可執行。

    image.png

    變數

    系統變數

    變數

    描述

    樣本

    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

    自訂變數

    工作流程中所有任務節點均可自訂變數,分為INOUT兩種類型。

    • IN:作為任務節點的輸入變數,當前節點指令碼可直接使用該變數的值。

    • OUT:如果下遊節點需要依賴上遊節點輸出的結果,可通過OUT類型變數進行參數傳遞。

    說明

    變數值的大小不能超過64KB。

    OUT類型變數將對節點整個下遊生效,不局限於下一節點。

    舉例說明:

    1. 在任務定義中配置如下指令碼。

      #!/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
    2. 在自訂參數中添加兩個OUT型別參數。

      image

    3. 此時指令碼最終任務結果為5050,並且在執行過程中為var1var2分別賦值為hello和world,通過步驟2的自訂參數配置,可將var1var2作為變數向下遊傳遞,如果未設定自訂參數,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(使用者無需手動建立)

    image

    {
      "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),若超過則提示匯入失敗。

    • 匯入格式與匯出格式一致,具體可見匯出部分說明。