流程(Flow)的多个状态(State)之间传递数据,和函数式编程语言类似。云工作流的状态类似于编程中的函数,它接受输入,并返回输出,输出保存在上下文中。本文介绍数据传递的基本概念和使用示例。
基本概念
云工作流的状态(State)之间可以进行组合嵌套,单个状态(State)运行过程中,其所处的环境中一些数据称为上下文。数据分类如下:
静态数据:例如当前状态(State)名称、流程(Flow)所处地域和流程(Flow)名称等。
动态数据:例如本次执行(Execution)的名称、输入;当前状态(State)的输入、输出和当前状态(State)的重试次数等。
数据访问
与流程和流程执行相关的数据,无论是静态数据,还是动态数据,您都通过系统提供的$Context
表达式来访问相关的数据,Context中包含的数据内容如下:
{
"Execution": {
"Name": "String",
"Input": {},
"RoleArn": "String"
},
"Current": {
"Name": "String",
"Input": {},
"Output": {},
"RetryCount": Number,
"TaskToken": "String"
}
}
Context可用于下面场景的数据构造:
循环状态中的ItemsPath字段,例如
$Context.Current.Input
。选择状态中的Condition字段,例如
$Context.Current.Input.Size>=1024
。
为了方便用户使用,云工作流提供两个使用频率较高的快捷方式$Input
$Output
,您可以使用其快速访问当前节点的输入和输出。
$Input == $Context.Current.Input
$Output == $Context.Current.Output
数据传递
不同类型的状态(State)之间存在不同的输入输出传输逻辑,在没有输入输出构造器定义的情况下,不同状态(State)的输入输出逻辑如下。
传递(Pass)/成功(Succeed)/失败(Fail)/等待(Wait)状态:接受输入,不做任何处理,直接输出。
选择(Choice)状态:只具备输入能力,会将自身的输入传递到指向的状态。例如,平移传输到Default,或者到某分支判断条件是否成立,如果条件成立,则将输入传输到Next状态。
并行(Parallel)状态:同一份输入,将会被深拷贝后同时传输给多个分支。输出将会被收集为Map[String]Any的形式,其中Key是每个Parallel分支的隐式名称 “Branch0~BranchN”,对应Value是每个Parallel分支实际的处理结果。
循环(Map)状态:同一份输入,将会判断是否为数组或者Map[String]Any,特别强调的是,当Map的输入不是数组时,如果用户也没有通过ItemsPath设置指定要迭代的内容,系统会自动获取Map的Values作为迭代数组;系统将会对该数组进行迭代,每一个数组元素将会作为迭代处理器的输入;Map输出将会被收集为Map[String]Array的形式,其中Key是固定字符串“Items”,Value是由多个迭代结果组成的数组。
使用示例
Type: StateMachine
Name: my-wkfl
SpecVersion: v1
StartAt: Parallel1
States:
- Type: Pass
Name: Step1
End: true
- Type: Pass
Name: Step2
InputConstructor:
FieldA: 123
- Type: Parallel
Name: Step3
InputConstructor:
FieldA: 123
Branches:
- StartAt: Pass1
States:
- Type: Pass
Name: Pass1
End: true
- StartAt: Pass2
States:
- Type: Pass
Name: Pass2
End: true
- Type: Pass
Name: Step4
End: true
以上示例中,Parallel1使用输入构造器,构造了一个具备一个属性的JSON Object对象,其中FieldA为123。 该输入被默认传输给ParallelBranch #0与ParallelBranch #1。其所处上下文的Scope与Current数据发生变化。 同样在ParallelBranch #0中,输入被传输给Pass1,站在Pass1运行完成的角度,上下文数据可能如下所示。
Context{
Current{
Name = Pass1
Input = { FieldA:123 }
Output = { FieldA:123 }
Error = null
RetryCount = 0
}
}
- 本页导读 (1)