数据流传递模型
云工作流的数据传递模型可如下图所示:
整体数据传递过程描述如下:
1、工作流传递的数据是按照JSON格式数据进行传递的。
2、工作流执行的输入数据作为工作流执行的第一个状态的输入数据。
3、工作流最后一个状态的执行输出作为工作流执行的输出数据。
4、每个状态执行完成后, 状态执行的输出数据作为下一个状态的输入数据, 如下图所示:
数据访问
云工作流提供了以JSONPath的方式访问在工作流执行过程中产生的数据。其语法格式为:
"{ $.ParentNode.childNodePath1.childNodePath2 }"
语法说明如下:
1、引用变量表达式需要是是字符串,因此需要双引号
2、字符串内容以{开头, 以}结尾, 代表是表达式, 云工作流引擎会按照表达式方式去解析字符串
3、如果要按照JSONPath访问访问引用变量数据, 则需要以符号$.开头
4、 云工作流是按照相对路径去解析引用变量的, 例如在工作流执行路径是state1->state2, 在state2中进行按照JSONPath方式去进行数据引用, 访问的数据源是state1产生的数据输出
以如下数据为例:
{
"testInt": 123,
"testString": "1234",
"testMap": {
"k1": "v1",
"k2": "v2"
}
}
如果要访问到k1这个节点的数据, 则可以按照如下方法引用到该数据变量, 得到的值即"v1"
"{ $.testMap.k1 }"
另外,为了方便在工作流执行输入过程中访问工作流执行输入, 提供的额外的全局方式去访问工作流执行输入, 语法如下:
"{ $Context.Input }"
如需要访问工作流执行输入数据的子层级, 即按照JSONPath访问json节点数据接口。例如工作流执行输入数据:
{
"key": "hello world"
}
按照"{ $Context.Input.key }"
去引用工作流执行输入数据, 得到的即"hello world"
数据传递
同类型的状态(State)存在不同的输入输出逻辑, 在没有输入输出过滤处理逻辑的情况下, 不同状态(State)的输入输出逻辑如下:
Operation(操作):通过数据访问章节的说明的方式访问和操作状态的输入数据, 再将执行任务的结果作为输出传递给后续状态。
Noop(传递)| Sleep(暂停)| Fail(失败):只接入输入, 不做任何处理, 直接输出。
Switch(条件分支):只具备输入能力,会将自身的输入传递到最终执行的条件分支跳转的状态。
Parallel(并行): 将自身输入深拷贝后传递到各个并行分支。输出会按照map[string]interface形式组织输出, key是按照并行分支"branch0 ~ branch$N"的方式命名, 对应的value是每个并行分支实际处理的结果。
Foreach(迭代):仅接受输入数据是数组形式。执行Foreach状态时, 会对数组进行迭代, 将每一个数组元素作为迭代处理器的输入。最终结果会按照数组形式组织输出, 数组的每个元素对应每次迭代输入对应的输出。
以包含Noop和Parallel状态的工作流执行为例, 工作流流程定义如下:
可视化流程 | 对应工作流流程定义yaml |
---|---|
|
工作流执行输入数据为:
{
"k1": "v1",
"k2": "v2"
}
执行后, 各个状态对应的输入输出为:
状态名(状态类型) | 输入数据 | 输出数据 |
---|---|---|
Hello(Noop) |
|
|
Parallel(Parallel) |
|
|