CloudFlow的各種狀態(State)之間需要傳遞資料,每個狀態(State)將接收來自前一狀態的輸入(Input),並返回輸出(Output),隨後將該輸出傳遞給下一個狀態(State)。本文將介紹輸入和輸出的基礎知識。
背景資訊
在雲工作流程中,多個狀態(State)之間進行資料傳遞,類似於函數式程式設計語言中的函數調用。每個狀態(State)接收輸入並返回輸出,輸出結果儲存在上下文中。這使得工作流程能夠在不同的狀態之間傳遞資料,實現複雜商務邏輯的自動化處理。
輸入和輸出的類型必須是JSON對象格式。流程狀態的輸入、輸出大小不能超過64 KiB,否則會導致流程執行失敗。
執行的輸入與輸出
執行輸入
每次流程執行時,您需要提供的資訊或資料,這些資料可能是流程中的某一或某些狀態需要的輸入。流程編排過程中可以通過系統資料表達式$Context.Execution.Input
訪問本次執行的輸入。
例如在學生線上報名註冊系統中,需要收集學生資訊,然後對資訊進行驗證,驗證無誤後完成註冊,在這3個環節中都需要使用學生的基本資料,您可以將學生基本資料作為公用資訊,填入執行輸入,讓3個狀態通過系統資料表達式的方式去擷取執行輸入。樣本如下圖所示:
執行輸出
每次流程執行成功後產生的結果。在流程編排過程中,無法通過系統變數訪問流程執行的輸出結果。
狀態的輸入與輸出
狀態輸入
流程編排過程中,可以通過系統資料表示式$Context.Current.Input
訪問目前狀態的輸入,快捷運算式為$Input
。
狀態輸出
流程編排過程中,可以通過系統資料表示式$Context.Current.Output
訪問目前狀態的輸出,快捷運算式為$Output
,當然並不是在所有的地方都能使用$Output
,僅僅在OutputConstructor範圍中可以使用$Output
。
構造器
構造器中涉及的系統資料表達式
構造器中涉及的系統資料表達式如下:
$Context:生命週期貫穿整個工作流程執行過程,關於
$Context
的詳細資料,請參見資料傳遞。$Input:生命週期開始於進入State,結束於State退出,是
$Context.Current.Input
的快捷形式。$Output:生命週期開始於進入任務調用返回,結束於State退出,是
$Context.Current.Output
的快捷形式。
在IO構造及參數構造過程中,如果鍵以
.$
結尾,則值必須是運算式,否則將會導致錯誤。當您在流程定義中使用內建函數或者以
$
開頭的系統變數時,為確保該變數被識別為變數而非一般字元串,您需要在變數名後添加一個.$
。在IO構造中,最多支援
10
層的內建函數嵌套。
下圖展示了$Input
、$Output
和$Context
這3個系統資料表達式的生命週期,以及它們是在不同狀態下的賦值過程。
圖中
$Input
表示在這個流程的執行輸入。圖中
$Input
=InputConstructor
表示在這個範圍內,InputConstructor
構造完成之後,將構造的結果賦值給$Input
。圖中
$Output
表示Task調用之後的返回結果,如果Task的調用是非同步回調模式,那麼$Output
取值就是回調之後的返回結果。圖中
$Output
=OutputConstructor
表示在這個範圍範圍內,OutputConstructor
構造完成之後,將構造的結果賦值給$Output
。圖中
$Context
貫穿全程,在工作流程執行過程中共用上下文資訊。
輸入構造器
InputConstructor
用於構建工作流程的輸入參數。輸入構造器的運算式與選擇(Choice)狀態的條件運算式不同,條件運算式只能返回布爾值,而輸入構造器的運算式可以返回任意值。狀態輸入構造器中可以使用的系統變數如下:
$Context
$Input
在多種輸入配置並存的情況下,輸入優先順序依次為:InputConstructor、ItemsPath和ItemConstructor。
以下狀態機器定義樣本顯示了輸入構造器的用法。
Type: StateMachine
Name: InputConstructExample
SpecVersion: v1
StartAt: InvokeFunction
States:
- Type: Task
Name: InvokeFunction
Action: FC:InvokeFunction
TaskMode: RequestComplete
InputConstructor:
FieldA.$: $Context.Execution.Input
FieldB: World
FieldC.$: length($Context.Execution.Input)
Parameters:
resourceArn: >-
acs:fc:cn-hangzhou:123456:services/helloworld.LATEST/functions/helloworld
invocationType: Sync
body.$: $Input
End: true
輸入構造器
InputConstructor
的資料結構為map[string]any。FieldA.$: $Context.Execution.Input
表示FieldA將動態擷取$Context.Execution.Input
運算式的值,而不是當作字串處理。FieldB: World
表示FieldB的內容是World,若FieldB後面沒有使用.$標記,後面的內容會當作字串處理,而不是動態引用。FieldC.$: length($Context.Execution.Input)
表示使用內建函數length擷取$Context.Execution.Input
值的長度,再將這個值賦值給FieldC。關於構造器中可使用的內建函數,請參見內建函數。
輸出構造器
OutputConstructor
與輸入構造器相比,輸出構造器除了執行時機不同,還可以使用更多的上下文運算式變數。例如,一個工作流程整合,在輸入構造器的位置,只可以使用$Context
與$Input
,而在輸出構造器的位置,已經通過該 Task 調用產生輸出,則可以使用$Output
代表輸出內容。狀態輸出構造器中可以使用的系統變數如下:
$Context
$Input
$Output
以下狀態機器定義樣本顯示了輸出構造器的用法。
Type: StateMachine
Name: OutputConstructExample
SpecVersion: v1
StartAt: InvokeFunction
States:
- Type: Task
Name: InvokeFunction
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
resourceArn: >-
acs:fc:cn-hangzhou:123456:services/helloworld.LATEST/functions/helloworld
invocationType: Sync
body.$: $Input
OutputConstructor:
returnID.$: uuid()
functionResult.$: $Output
functionResultStr.$: jsonToString($Output)
executionInput.$: $Context.Execution.Input
lastOutput.$: $Input
End: true
輸出構造器
OutputConstructor
的資料結構為map[string]any。functionResult.$
、executionInput.$
和lastOutput.$
使用動態引用擷取狀態輸出、執行輸入和狀態輸入。returnID.$
和functionResultStr.$
分別使用內建函數擷取唯一ID、將狀態輸出轉換為字串。