數(shù)據(jù)傳遞
流程(Flow)的多個(gè)狀態(tài)(State)之間傳遞數(shù)據(jù),和函數(shù)式編程語(yǔ)言類似。云工作流的狀態(tài)類似于編程中的函數(shù),它接受輸入,并返回輸出,輸出保存在上下文中。本文介紹數(shù)據(jù)傳遞的基本概念和使用示例。
基本概念
云工作流的狀態(tài)(State)之間可以進(jìn)行組合嵌套,單個(gè)狀態(tài)(State)運(yùn)行過(guò)程中,其所處的環(huán)境中一些數(shù)據(jù)稱為上下文。數(shù)據(jù)分類如下:
流程數(shù)據(jù):流程(Flow)的名稱、地域;組成流程的各個(gè)狀態(tài)(State)名稱;流程執(zhí)行過(guò)程中依賴的訪問(wèn)角色等信息;
執(zhí)行數(shù)據(jù):執(zhí)行(Execution)的名稱、執(zhí)行輸入;執(zhí)行過(guò)程中當(dāng)前狀態(tài)(State)的輸入、輸出;執(zhí)行中生成的用于回調(diào)的Token信息,以及執(zhí)行過(guò)程中狀態(tài)(State)發(fā)生錯(cuò)誤之后,產(chǎn)生的錯(cuò)誤信息,針對(duì)錯(cuò)誤處理的重試次數(shù)等信息。
數(shù)據(jù)訪問(wèn)
與流程和流程執(zhí)行相關(guān)的數(shù)據(jù),無(wú)論是靜態(tài)數(shù)據(jù),還是動(dòng)態(tài)數(shù)據(jù),您都通過(guò)系統(tǒng)提供的$Context
表達(dá)式來(lái)訪問(wèn)相關(guān)的數(shù)據(jù),Context中包含的數(shù)據(jù)內(nèi)容如下:
{
"Execution": {
"Name": "String",
"Input": {},
"RoleArn": "String"
},
"Current": {
"Name": "String",
"Input": {},
"Output": {},
"Error": {
"Code": "String",
"Detail": "String"
},
"RetryCount": "Number",
"TaskToken": "String"
}
}
Context 可用于下面場(chǎng)景的數(shù)據(jù)構(gòu)造:
輸入輸出構(gòu)造器。詳細(xì)信息,請(qǐng)參見(jiàn)輸入和輸出和狀態(tài)輸出構(gòu)造器。
循環(huán)狀態(tài)中的ItemsPath字段,例如
$Context.Current.Input
。選擇狀態(tài)中的Condition字段,例如
$Context.Current.Input.Size>=1024
。錯(cuò)誤處理信息判斷,例如
$Context.Current.Error.Code
或$Context.Current.Error.Detail
。任務(wù)回調(diào)Token 傳遞,例如
$Context.Current.TaskToken
。
為了方便用戶使用,云工作流提供兩個(gè)使用頻率較高的快捷方式$Input
$Output
,您可以使用其快速訪問(wèn)當(dāng)前節(jié)點(diǎn)的輸入和輸出。
$Input 等價(jià)于 $Context.Current.Input
$Output 等價(jià)于 $Context.Current.Output
數(shù)據(jù)傳遞
不同類型的狀態(tài)(State)之間存在不同的輸入輸出傳輸邏輯,在沒(méi)有輸入輸出構(gòu)造器定義的情況下,不同狀態(tài)(State)的輸入輸出邏輯如下。
傳遞(Pass)/成功(Succeed)/失敗(Fail)/等待(Wait)狀態(tài):接受輸入,不做任何處理,直接輸出。
選擇(Choice)狀態(tài):只具備輸入能力,會(huì)將自身的輸入傳遞到指向的狀態(tài)。例如,平移傳輸?shù)紻efault,或者到某分支判斷條件是否成立,如果條件成立,則將輸入傳輸?shù)絅ext狀態(tài)。
并行(Parallel)狀態(tài):同一份輸入,將會(huì)被深拷貝后同時(shí)傳輸給多個(gè)分支。輸出將會(huì)被收集為Map[String]Any的形式,其中Key是每個(gè)Parallel分支的隱式名稱 “Branch0~BranchN”,對(duì)應(yīng)Value是每個(gè)Parallel分支實(shí)際的處理結(jié)果。
迭代(Map)狀態(tài):同一份輸入,將會(huì)判斷是否為數(shù)組或者M(jìn)ap[String]Any,特別強(qiáng)調(diào)的是,當(dāng)Map的輸入不是數(shù)組時(shí),如果用戶也沒(méi)有通過(guò)ItemsPath設(shè)置指定要迭代的內(nèi)容,系統(tǒng)會(huì)自動(dòng)獲取Map的Values作為迭代數(shù)組;系統(tǒng)將會(huì)對(duì)該數(shù)組進(jìn)行迭代,每一個(gè)數(shù)組元素將會(huì)作為迭代處理器的輸入;Map輸出將會(huì)被收集為Map[String]Array的形式,其中Key是固定字符串“Items”,Value是由多個(gè)迭代結(jié)果組成的數(shù)組。
任務(wù)(Task)狀態(tài):接受來(lái)自前一個(gè)狀態(tài)或外部數(shù)據(jù)源的輸入數(shù)據(jù),在任務(wù)腳本中執(zhí)行具體業(yè)務(wù)邏輯,使用
$Context
表達(dá)式訪問(wèn)和操作數(shù)據(jù),再將任務(wù)執(zhí)行的結(jié)果作為輸出數(shù)據(jù)傳遞給后續(xù)狀態(tài)或存儲(chǔ)在外部系統(tǒng)中。
使用示例
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 狀態(tài)中使用輸入構(gòu)造器,構(gòu)造了包含一個(gè)屬性的 JSONObject,其中屬性FieldA為123。 該輸入被默認(rèn)傳輸給ParallelBranch #0與ParallelBranch #1。以其中一個(gè)Branch為例,在ParallelBranch #0中,輸入被傳輸給Pass1,站在Pass1運(yùn)行完成的角度,上下文數(shù)據(jù)如下所示。
{
"Execution": {
"Name": "xxxx-xxxx-xxxx-xxxx",
"Input": {},
"RoleArn": "xxxx"
},
"Current": {
"Name": "Pass1",
"Input": {
"FieldA": 123
},
"Output": {
"FieldA": 123
},
"Error": null,
"RetryCount": 0
}
}