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