输入和输出

云工作流的各种状态(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、将状态输出转换为字符串。