數據流傳遞模型
云工作流的數據傳遞模型可如下圖所示:
整體數據傳遞過程描述如下:
1、工作流傳遞的數據是按照JSON格式數據進行傳遞的。
2、工作流執行的輸入數據作為工作流執行的第一個狀態的輸入數據。
3、工作流最后一個狀態的執行輸出作為工作流執行的輸出數據。
4、每個狀態執行完成后, 狀態執行的輸出數據作為下一個狀態的輸入數據, 如下圖所示:
數據訪問
云工作流提供了以JSONPath的方式訪問在工作流執行過程中產生的數據。其語法格式為:
"{ $.ParentNode.childNodePath1.childNodePath2 }"語法說明如下:
1、引用變量表達式需要是是字符串,因此需要雙引號
2、字符串內容以{開頭, 以}結尾, 代表是表達式, 云工作流引擎會按照表達式方式去解析字符串
3、如果要按照JSONPath訪問訪問引用變量數據, 則需要以符號$.開頭
4、 云工作流是按照相對路徑去解析引用變量的, 例如在工作流執行路徑是state1->state2, 在state2中進行按照JSONPath方式去進行數據引用, 訪問的數據源是state1產生的數據輸出
以如下數據為例:
{
"testInt": 123,
"testString": "1234",
"testMap": {
"k1": "v1",
"k2": "v2"
}
}如果要訪問到k1這個節點的數據, 則可以按照如下方法引用到該數據變量, 得到的值即"v1"
"{ $.testMap.k1 }"另外,為了方便在工作流執行輸入過程中訪問工作流執行輸入, 提供的額外的全局方式去訪問工作流執行輸入, 語法如下:
"{ $Context.Input }"如需要訪問工作流執行輸入數據的子層級, 即按照JSONPath訪問json節點數據接口。例如工作流執行輸入數據:
{
"key": "hello world"
}
按照"{ $Context.Input.key }"去引用工作流執行輸入數據, 得到的即"hello world"
數據傳遞
同類型的狀態(State)存在不同的輸入輸出邏輯, 在沒有輸入輸出過濾處理邏輯的情況下, 不同狀態(State)的輸入輸出邏輯如下:
Operation(操作):通過數據訪問章節的說明的方式訪問和操作狀態的輸入數據, 再將執行任務的結果作為輸出傳遞給后續狀態。
Noop(傳遞)| Sleep(暫停)| Fail(失敗):只接入輸入, 不做任何處理, 直接輸出。
Switch(條件分支):只具備輸入能力,會將自身的輸入傳遞到最終執行的條件分支跳轉的狀態。
Parallel(并行): 將自身輸入深拷貝后傳遞到各個并行分支。輸出會按照map[string]interface形式組織輸出, key是按照并行分支"branch0 ~ branch$N"的方式命名, 對應的value是每個并行分支實際處理的結果。
Foreach(迭代):僅接受輸入數據是數組形式。執行Foreach狀態時, 會對數組進行迭代, 將每一個數組元素作為迭代處理器的輸入。最終結果會按照數組形式組織輸出, 數組的每個元素對應每次迭代輸入對應的輸出。
以包含Noop和Parallel狀態的工作流執行為例, 工作流流程定義如下:
| 可視化流程 | 對應工作流流程定義yaml |
|---|---|
|
工作流執行輸入數據為:
{
"k1": "v1",
"k2": "v2"
}
執行后, 各個狀態對應的輸入輸出為:
| 狀態名(狀態類型) | 輸入數據 | 輸出數據 |
|---|---|---|
| Hello(Noop) | | |
| Parallel(Parallel) | | |