流程(Flow)中的多個狀態(State)之間傳遞資料的方式與函數式程式設計語言相似。CloudFlow的狀態可類比於編程中的函數,它接受輸入並返回輸出,輸出結果儲存在上下文中。本文將介紹資料傳遞的基本概念及其使用樣本。
基本概念
CloudFlow的狀態(State)之間可以進行組合嵌套,單個狀態(State)運行過程中,其所處的環境中一些資料稱為上下文。資料分類如下:
流程資料:流程(Flow)的名稱、地區;組成流程的各個狀態(State)名稱;流程執行過程中依賴的訪問角色等資訊;
執行資料:執行(Execution)的名稱、執行輸入;執行過程中目前狀態(State)的輸入、輸出;執行中產生的用於回調的Token資訊,以及執行過程中狀態(State)發生錯誤之後,產生的錯誤資訊,針對錯誤處理的重試次數等資訊。
資料訪問
與流程和流程執行相關的資料,無論是待用資料,還是動態資料,您都通過系統提供的$Context
運算式來訪問相關的資料,Context中包含的資料內容如下:
{
"Execution": {
"Name": "String",
"Input": {},
"RoleArn": "String"
},
"Current": {
"Name": "String",
"Input": {},
"Output": {},
"Error": {
"Code": "String",
"Detail": "String"
},
"RetryCount": "Number",
"TaskToken": "String"
}
}
Context可用於下面情境的資料構造:
輸入輸出構造器。詳細資料,請參見輸入和輸出。
迭代(Map)狀態中的ItemsPath欄位,例如
$Context.Current.Input
。選擇(Choice)狀態中的Condition欄位,例如
$Context.Current.Input.Size>=1024
。錯誤處理資訊判斷,例如
$Context.Current.Error.Code
或$Context.Current.Error.Detail
。任務回調Token 傳遞,例如
$Context.Current.TaskToken
。
為了方便使用者使用,CloudFlow提供兩個使用頻率較高的捷徑$Input
和$Output
,您可以使用其快速存取當前節點的輸入和輸出。
$Input
等價於$Context.Current.Input
$Output
等價於$Context.Current.Output
資料傳遞
不同類型的狀態(State)之間存在不同的輸入輸出傳輸邏輯,在沒有輸入輸出構造器定義的情況下,不同狀態(State)的輸入輸出邏輯如下。
傳遞(Pass)/成功(Succeed)/失敗(Fail)/等待(Wait)狀態:接受輸入,不做任何處理,直接輸出。
選擇(Choice)狀態:只具備輸入能力,會將自身的輸入傳遞到指向的狀態。例如,平移傳輸到Default,或者到某分支判斷條件是否成立,如果條件成立,則將輸入傳輸到Next狀態。
並行(Parallel)狀態:同一份輸入,將會被深拷貝後同時傳輸給多個分支。輸出將會被收集為Map[String]Any的形式,其中Key是每個Parallel分支的隱式名稱“Branch0~BranchN”,對應Value是每個Parallel分支實際的處理結果。
迭代(Map)狀態:同一份輸入,將會判斷是否為數組或者Map[String]Any,特彆強調的是,當Map的輸入不是數組時,如果使用者也沒有通過ItemsPath設定指定要迭代的內容,系統會自動擷取Map的Values作為迭代數組;系統將會對該數組進行迭代,每一個數組元素將會作為迭代處理器的輸入;Map輸出將會被收集為Map[String]Array的形式,其中Key是固定字串“Items”,Value是由多個迭代結果組成的數組。
任務(Task)狀態:接受來自前一個狀態或外部資料源的輸入資料,在任務指令碼中執行具體商務邏輯,使用
$Context
運算式訪問和操作資料,再將任務執行的結果作為輸出資料傳遞給後續狀態或儲存在外部系統中。
使用樣本
Type: StateMachine
Name: DataTransferExample
SpecVersion: v1
StartAt: Step1
States:
- Type: Pass
Name: Step1
Next: Step2
- Type: Parallel
Name: Step2
InputConstructor:
FieldA: 123
Branches:
- StartAt: Pass1
States:
- Type: Pass
Name: Pass1
End: true
- StartAt: Pass2
States:
- Type: Pass
Name: Pass2
End: true
Next: Step3
- Type: Pass
Name: Step3
End: true
以上樣本中,在Parallel類型的Step2狀態中使用輸入構造器,構造了包含一個屬性的JSONObject,其中屬性FieldA為123。 該輸入被預設傳輸給ParallelBranch #0與ParallelBranch #1。以其中一個Branch為例,在ParallelBranch #0中,輸入被傳輸給Pass1,站在Pass1運行完成的角度,上下文資料如下所示。
{
"Execution": {
"Name": "xxxx-xxxx-xxxx-xxxx",
"Input": {},
"RoleArn": "xxxx"
},
"Current": {
"Name": "Pass1",
"Input": {
"FieldA": 123
},
"Output": {
"FieldA": 123
},
"Error": null,
"RetryCount": 0
}
}