全部產品
Search
文件中心

CloudFlow:輸入和輸出

更新時間:Oct 30, 2024

CloudFlow的各種狀態(State)之間需要傳遞資料,每個狀態(State)將接收來自前一狀態的輸入(Input),並返回輸出(Output),隨後將該輸出傳遞給下一個狀態(State)。本文將介紹輸入和輸出的基礎知識。

背景資訊

在雲工作流程中,多個狀態(State)之間進行資料傳遞,類似於函數式程式設計語言中的函數調用。每個狀態(State)接收輸入並返回輸出,輸出結果儲存在上下文中。這使得工作流程能夠在不同的狀態之間傳遞資料,實現複雜商務邏輯的自動化處理。

說明

輸入和輸出的類型必須是JSON對象格式。流程狀態的輸入、輸出大小不能超過64 KiB,否則會導致流程執行失敗。

執行的輸入與輸出

執行輸入

每次流程執行時,您需要提供的資訊或資料,這些資料可能是流程中的某一或某些狀態需要的輸入。流程編排過程中可以通過系統資料表達式$Context.Execution.Input訪問本次執行的輸入。

例如在學生線上報名註冊系統中,需要收集學生資訊,然後對資訊進行驗證,驗證無誤後完成註冊,在這3個環節中都需要使用學生的基本資料,您可以將學生基本資料作為公用資訊,填入執行輸入,讓3個狀態通過系統資料表達式的方式去擷取執行輸入。樣本如下圖所示:

image

執行輸出

每次流程執行成功後產生的結果。在流程編排過程中,無法通過系統變數訪問流程執行的輸出結果。

狀態的輸入與輸出

狀態輸入

流程編排過程中,可以通過系統資料表示式$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個系統資料表達式的生命週期,以及它們是在不同狀態下的賦值過程。

image

  • 圖中$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、將狀態輸出轉換為字串。