本文为您提供工作流中状态类型的整体介绍,包括暂停(Sleep)、操作(Operation)、传递(Noop)、条件分支(Switch)、迭代(Foreach)和并行(Parallel)状态,帮助您理解其功能和应用,助力复杂流程的构建与管理。
整体介绍
工作流状态是流程定义的核心组件,用于实现特定的逻辑、控制和执行操作。以下六种状态类型各具特色,满足从延迟执行、API调用到条件判断、并行处理的多样化需求:
暂停(Sleep)状态:在工作流中引入时间延迟,支持相对时长或绝对时间点暂停,适用于定时任务或等待场景。
操作(Operation)状态:执行具体功能,如调用云服务API、函数或第三方HTTP请求,是工作流中任务执行的基础。
传递(Noop)状态:作为占位符或数据转换工具,传递输入数据,常用于流程设计初期的调试和规划。
条件分支(Switch)状态:根据条件表达式选择执行路径,类似编程中的switch-case,灵活控制流程方向。
迭代(Foreach)状态:并行遍历输入数组,对每个元素执行处理器逻辑,类似foreach循环,高效处理批量数据。
并行(Parallel)状态:并行执行多个分支,合并各分支结果,适用于需要同时处理多项任务的场景。
这些状态通过组合使用,支持动态、健壮且高效的工作流设计。
状态介绍
暂停(Sleep)状态
本节将为您详细介绍暂停状态(Sleep)的功能及其应用示例,帮助您在工作流中实现流程的暂停与延续。
基本概念
暂停状态(Sleep)用于在工作流中暂停执行一段指定时间,之后继续后续流程。
您可以设置一个相对时长(如暂停10秒)或一个绝对时间点(如某年8月11日08:00)来控制流程的延迟,适用于需要定时等待的场景。
状态属性
暂停状态包含以下关键属性,用于定义其行为和延迟时长:
字段 | 类型 | 是否必选 | 描述 | 示例值 |
---|---|---|---|---|
name | string | 是 | 状态的名称,用于唯一标识。 | sleep-state |
type | string | 是 | 状态类型,固定为“Sleep”。 | Sleep |
duration | string | 否 | sleep相对事件,和until互斥,ms/s/m/h | 10s |
until | string | 否 | sleep绝对时间,遵循RFC3339格式,和duration互斥 | 2024-11-22T17:40:40+08:00 |
end | bool | 否 | 表示该状态是否为当前分支的终点。 | true |
stateDataFilter | StateDataFilter | 否 | 输入/输出构造器,参考流程定义介绍中StateDataFilter 字段说明 | |
transition | Transition | 否 | 参考流程定义介绍中Transition 字段说明 |
注意事项:
duration和until必须且只能选择一个进行配置。
使用示例1
以下示例展示如何定义一个暂停状态,暂停流程10秒:
specVersion: '0.8'
version: '1.0'
name: test
start: SleepDuration
states:
- name: SleepDuration
type: Sleep
duration: 10s
transition:
nextState: Final
示例说明
name: 状态类型为
Sleep
,表示暂停状态。type: 状态命名为
SleepDuration
,便于识别。duration: 设置暂停时长为10秒。
transition: sleep完成后跳转至Final状态。
使用示例2
以下示例展示如何定义一个暂停状态,在指定时间点继续执行:
specVersion: '0.8'
version: '1.0'
name: test
start: SleepUntil
states:
- name: SleepUntil
type: Sleep
until: 2024-11-22T17:40:40+08:00
transition:
nextState: Final
示例说明
type: 状态类型为
Sleep
,表示暂停状态。name: 状态命名为
SleepUntil
,便于识别。until: 在2024-11-22日17:40继续执行。
transition: sleep完成后跳转至Final状态。
操作(Operation)状态
本节为您介绍操作状态(Operation)的核心概念及实用示例,指导您如何通过操作状态调用集成服务API,构建复杂的工作流程。
基本概念
操作状态(Operation)用于在工作流中调用集成服务API以执行特定功能。
您可以通过操作状态发起函数调用、请求天翼云服务API,或通过HTTP/HTTPS等协议访问第三方服务。在流程定义中,将状态类型指定为“Operation”即可标记为操作状态。
状态属性
操作状态包含以下关键属性,用于定义其行为和调用方式:
字段 | 类型 | 是否必选 | 描述 | 示例值 |
---|---|---|---|---|
name | string | 是 | 状态的名称,用于唯一标识。 | op_example |
type | string | 是 | 状态类型,固定为“Operation”。 | Operation |
actions | []Action | 是 | 参考Action 属性,当前只支持单一Action | |
end | bool | 否 | 表示该状态是否为当前分支的终点。 | true |
stateDataFilter | StateDataFilter | 否 | 输入/输出构造器,参考流程定义介绍中StateDataFilter 字段说明 | |
transition | Transition | 否 | 参考流程定义介绍中Transition 字段说明 |
Action属性
定义操作状态的具体行为,支持调用函数或服务API:
字段 | 类型 | 是否必选 | 描述 | 示例值 |
---|---|---|---|---|
functionRef | FunctionRef | 是 | 引用具体的函数或操作,详见FunctionRef 定义。 | |
retryRef | RetryRef | 是 | 引用具体的重试策略,参考错误处理章节。 | |
catchRef | CatchRef | 是 | 引用具体的错误捕获策略,参考错误处理章节。 | |
actionExecuteMode | string | 否 | 执行模式,详细说明请参考服务集成模式 ,仅标准工作流下可配置。默认为RequestComplete。 |
|
FunctionRef属性
定义操作状态的具体行为,支持调用函数或服务API:
字段 | 类型 | 是否必选 | 描述 | 示例值 |
---|---|---|---|---|
type | string | 是 | 类型 | CF:invokeFunction |
arguments | map[string]any | 否 | 调用参数,具体内容依动作类型而定。 |
调用示例
示例1:调用函数计算
通过操作状态调用函数计算服务,Parameters字段定义调用参数,具体规范参考配置参数文档。支持优化集成调用或直接使用天翼云OpenAPI。
specVersion: '0.8'
version: '1.0'
name: test
start: InvokeFunction
states:
- name: InvokeFunction
type: Operation
actions:
- functionRef:
type: CF:invokeFunction
arguments:
functionName: test-function
qualifier: LATEST
region: b342b77ef26b11ecb0ac0242ac110002
transition:
nextState: Final
示例2:调用ctyun api列出pg数据库
specVersion: '0.8'
version: '1.0'
name: test
start: listPgDataBases
states:
- name: listPgDataBases
type: Operation
metadata: {}
stateDataFilter: {}
actions:
- retryRef: []
catchRef: []
functionRef:
type: ctapi
arguments:
statusType: pgsql:listPgDataBases
ctapictrn: pgsql:hbbd1-a:listPgDataBases:3776
capacityId: 3776
method: GET
path: /v1/database/list
headers:
regionId: bb9fdb42056f11eda1610242ac110002
uriParameters: {}
queryParameters:
prodInstId: ''
body: {}
actionExecuteMode: RequestComplete
end: true
补充说明
应用场景:操作状态适用于调用云服务API、函数计算或第三方服务,助力复杂流程的自动化。
错误处理:通过Retry和Catch配置,可实现重试和异常捕获,提升流程健壮性。
传递(Noop)状态
本节将为您详细介绍传递状态(Noop)的功能及其应用示例,帮助您了解其在工作流设计中的作用。
基本概念
传递状态是一种灵活的工作流组件,可作为占位符或数据转换工具使用。它能够将输入数据调整为所需的输出格式,特别适合在流程设计的初期使用。
例如,当您尚未定义具体的集成任务状态时,可以通过控制状态和传递状态来搭建和验证流程逻辑。待逻辑完善后,您可以将传递状态逐步替换为实际的任务状态。
Noop实际是一种特殊的Operation,noop状态与operation状态结构一致,但部分参数不可用。
状态属性
操作状态包含以下关键属性,用于定义其行为和调用方式:
字段 | 类型 | 是否必选 | 描述 | 示例值 |
---|---|---|---|---|
name | string | 是 | 状态的名称,用于唯一标识。 | op_example |
type | string | 是 | 状态类型,固定为“Operation”。 | Operation |
actions | []Action | 是 | 参考Action 属性,当前只支持单一Action | |
end | bool | 否 | 表示该状态是否为当前分支的终点。 | true |
stateDataFilter | StateDataFilter | 否 | 输入/输出构造器,参考流程定义介绍中StateDataFilter 字段说明 | |
transition | Transition | 否 | 参考流程定义介绍中Transition 字段说明 |
Action属性
定义操作状态的具体行为,支持调用函数或服务API:
字段 | 类型 | 是否必选 | 描述 | 示例值 |
---|---|---|---|---|
functionRef | FunctionRef | 是 | 引用具体的函数或操作,详见FunctionRef 定义。 |
FunctionRef属性
定义操作状态的具体行为,支持调用函数或服务API:
字段 | 类型 | 是否必选 | 描述 | 示例值 |
---|---|---|---|---|
type | string | 是 | 操作类型,固定为“Noop” | Noop |
使用示例
以下是一个传递状态的定义示例,该状态在执行后输出一个包含字段 FieldA
的 JSON 对象,值为 123:
specVersion: '0.8'
version: '1.0'
name: test
start: noop1
states:
- name: noop1
type: Operation
actions:
- functionRef:
type: Noop
end: true
stateDataFilter:
input: '{ $Context.Input.data }'
output: '{ $.fieldA }'
示例解析:
type:指定状态类型为
Noop
,表明这是一个传递状态。name:状态命名为
noop1
,便于在流程中识别。End:设置为
true
,表示该状态是工作流的终点,无需指定后续状态。stateDataFilter:定义输入输出构造器。
失败(Fail)状态
本节将为您详细介绍传递失败(Fail)的功能及其应用示例,帮助您了解其在工作流设计中的作用。
基本概念
Fail状态会返回失败结果,可用于提前结束工作流执行并将执行结果置为失败。
Fail实际是一种特殊的Operation,noop状态与operation状态结构一致,但部分参数不可用。
状态属性
操作状态包含以下关键属性,用于定义其行为和调用方式:
字段 | 类型 | 是否必选 | 描述 | 示例值 |
---|---|---|---|---|
name | string | 是 | 状态的名称,用于唯一标识。 | op_example |
type | string | 是 | 状态类型,固定为“Operation”。 | Operation |
actions | []Action | 是 | 参考Action 属性,当前只支持单一Action | |
end | bool | 否 | 表示该状态是否为当前分支的终点,固定为true | true |
Action属性
定义操作状态的具体行为,支持调用函数或服务API:
字段 | 类型 | 是否必选 | 描述 | 示例值 |
---|---|---|---|---|
functionRef | FunctionRef | 是 | 引用具体的函数或操作,详见FunctionRef 定义。 |
FunctionRef属性
定义操作状态的具体行为,支持调用函数或服务API:
字段 | 类型 | 是否必选 | 描述 | 示例值 |
---|---|---|---|---|
type | string | 是 | 操作类型,固定为“Fail” | Fail |
arguments | map[string]string | 是 | 调用参数:
|
使用示例
以下是一个失败状态的定义示例:
specVersion: '0.8'
version: '1.0'
name: test
start: Fail
states:
- name: fail
type: Operation
actions:
- functionRef:
type: Fail
arguments:
errorType: customError
errorMessage: "User called fail"
end: true
示例解析:
type:指定状态类型为
Fail
,表明这是一个传递状态。name:状态命名为
fail
,便于在流程中识别。End:设置为
true
,表示该状态是工作流的终点,无需指定后续状态。errorType:错误类型为
customError
。errorMessage:错误消息为
User called fail
。
条件分支(Switch)状态
本节将为您详细讲解条件分支状态(Switch)的基本概念、使用场景示例以及条件表达式的应用,帮助您更好地在工作流中运用此状态。
基本概念
条件分支状态(Switch)是工作流中的条件选择工具,允许流程根据预设条件执行不同的路径。其功能类似于编程中的 switch-case
语句。
它由若干条件(dataConditions)和一个默认条件(defaultCondition)组成,每个分支包含一个条件表达式和一个跳转目标。
状态属性
条件分支状态的属性定义了其逻辑和行为:
字段 | 类型 | 是否必选 | 描述 | 示例值 |
---|---|---|---|---|
name | string | 是 | 状态的名称,用于唯一标识。 | my switch |
type | string | 是 | 状态类型,固定为“Switch”。 | Switch |
dataConditions | []DataCondition | 是 | 条件列表,详见DataCondition 属性 | |
defaultCondition | DefaultCondition | 是 | 默认情况,详见DefaultCondition 属性 | |
stateDataFilter | StateDataFilter | 否 | 输入/输出构造器,参考流程定义介绍中StateDataFilter 字段说明 |
DataCondition属性
字段 | 类型 | 是否必选 | 描述 | 示例值 |
---|---|---|---|---|
condition | string | 是 | 条件表达式 | { $.Value > 10 } |
transition | Transition | 否 | 参考流程定义介绍中Transition 字段说明 |
DefaultCondition属性
字段 | 类型 | 是否必选 | 描述 | 示例值 |
---|---|---|---|---|
transition | Transition | 否 | 参考流程定义介绍中Transition 字段说明 |
注意事项:
条件(DataCondition)不支持直接使用
End
或Transition
属性。默认分支(DefaultCondition)起到类似Transition
的作用,指定条件不满足时的路径。条件(DataCondition)中,每个分支通过
transition
字段指定条件满足时的跳转目标。
系统会按顺序检查每个条件的表达式:
如果某个条件被满足,则跳转至该条件指定的状态继续执行。
如果所有条件均不满足,则执行默认条件指定的状态和后续流程。
使用示例
以下是一个条件分支状态的实际应用案例:
specVersion: '0.8'
version: '1.0'
name: test
start: Switch1
- name: Switch1
type: Switch
dataConditions:
- condition: "{ $Context.Input.value > 20 }"
transition: Over20
- condition: "{ $Context.Input.value > 10 }"
transition: Over10
defaultCondition:
transition: Fail
示例说明
type: 状态类型为
Switch
,表示条件分支。name: 状态名为
Switch1
。第一个condition: 条件{ $Context.Input.value > 20 },代表如果value的值大于20,则跳转到Over20状态继续执行。
第二个condition: 条件{ $Context.Input.value > 10 },代表第一个condition未被满足,如果10 < value <=20,则跳转到Over10状态继续执行。
defaultCondition: 上诉两个condition都不满足时,跳转到Fail状态继续执行。
该条件分支状态执行示例如下:
输入与条件结果样例
假设输入数据 $Input
为:
{
"x": 50,
"y": {
"y1": false,
"y2": "active"
},
"z": [10, 20, 30]
}
以下是条件表达式的执行结果:
条件表达式 | 执行结果 |
---|---|
$Input.x == 50 | true |
$Input.x < 100 | true |
$Input.x > 60 | false |
$Input.y.y1 | false |
$Input.y.y2 == “active” | true |
$Input.z[1] == 20 | true |
提示:
表达式中可使用
$.
和$Context
获取变量,具体用法请参考相关数据传递文档。
条件分支状态(Switch)通过分支和默认路径,为工作流提供了灵活的逻辑控制能力。掌握其属性配置和条件表达式的编写,您可以轻松实现动态流程设计。如需更多帮助,请联系支持团队。
迭代(Foreach)状态
本节为您介绍迭代状态(Foreach)的核心概念及应用示例,指导您如何在工作流中遍历数组并并行处理元素。
基本概念
迭代状态(Foreach)用于遍历输入中的数组类型参数,对每个元素并行执行指定的处理器(Processor)状态。其功能类似于编程语言中的foreach
循环,但区别在于迭代状态采用并行方式处理所有元素。
在执行过程中,系统并发运行输入数组中每个元素的处理器状态。所有分支完成后,默认生成一个包含各分支结果的map[string]any
结构,并可通过数据过滤器或后续逻辑进一步处理结果。
状态属性
迭代状态(Foreach)包含以下关键属性,用于定义其行为和处理逻辑:
字段 | 类型 | 是否必选 | 描述 | 示例值 |
---|---|---|---|---|
name | string | 是 | 状态的名称,用于唯一标识。 | ForeachTest |
type | string | 是 | 状态类型,固定为“Foreach”。 | Foreach |
processor | object | 是 | 迭代处理器,定义元素处理逻辑。 | 见processor说明 |
end | bool | 否 | 表示是否为当前流程的终点。 | true |
stateDataFilter | StateDataFilter | 否 | 输入/输出构造器,参考流程定义介绍中StateDataFilter 字段说明 | |
transition | Transition | 否 | 参考流程定义介绍中Transition 字段说明 | |
retryRef | RetryRef | 是 | 引用具体的重试策略,参考错误处理章节。 | |
catchRef | CatchRef | 是 | 引用具体的错误捕获策略,参考错误处理章节。 |
processor 属性
迭代处理器,定义如何处理数组中的每个元素,每个processor定义的states组成一个子流程,从startAt指定的状态开始执行,states中必须存在一个end状态:
字段 | 类型 | 是否必选 | 描述 | 示例值 |
---|---|---|---|---|
startAt | string | 是 | 嵌套状态数组的执行起点。 | ForeachNoop |
states | array | 是 | 嵌套的状态数组,定义处理逻辑。 |
使用示例
以下示例定义一个迭代状态,遍历输入数组,处理器包含操作和休眠状态:
specVersion: '0.8'
version: '1.0'
name: test
start: ForeachTest
states:
- name: ForeachTest
type: Foreach
processor:
startAt: ForeachNoop
states:
- name: ForeachNoop
type: Operation
actions:
- functionRef:
type: Noop
transition:
nextState: Sleep
stateDataFilter:
output:
ft: "{ $.from + '|' + $.to }"
- name: Sleep
type: Sleep
duration: 30s
end: true
end: true
metadata:
description: ''
示例说明
name: 状态名为“ForeachTest”。
type: 状态类型为“Foreach”。
processor: 定义处理逻辑,起始于“ForeachNoop”。
startAt: 子流程从“ForeachNoop”开始执行
states: 包含“ForeachNoop”操作状态(执行Noop动作)和“Sleep”状态(休眠30秒)。
end: Sleep设置end为true,说明子流程在该状态结束。
补充说明
并行处理:迭代状态并行处理数组元素,提升效率。
数据过滤:通过
stateDataFilter
自定义输出格式。灵活性:子流程支持嵌套多种状态类型,如操作或休眠。
并行(Parallel)状态
本节为您介绍并行状态(Parallel)的核心概念及应用示例,指导您如何在工作流中实现多分支并行执行。
基本概念
并行状态(Parallel)用于同时执行多个独立的分支(branches),每个分支通过processor定义一个子流程。
执行时,系统并发运行所有分支内的状态。待所有分支完成后,默认生成一个map[string]any
结构,包含各分支的执行结果,并可通过后续状态或过渡逻辑进一步处理。
状态属性
并行状态包含以下关键属性,用于定义其行为和执行逻辑:
字段 | 类型 | 是否必选 | 描述 | 示例值 |
---|---|---|---|---|
name | string | 是 | 状态的名称,用于唯一标识。 | ParallelTest |
type | string | 是 | 状态类型,固定为“Parallel”。 | Parallel |
branches | []Branch | 是 | 并行分支的定义。 | 见Branch说明 |
end | bool | 否 | 表示该状态是否为当前分支的终点。 | true |
stateDataFilter | StateDataFilter | 否 | 输入/输出构造器,参考流程定义介绍中StateDataFilter 字段说明 | |
transition | Transition | 否 | 参考流程定义介绍中Transition 字段说明 | |
retryRef | RetryRef | 是 | 引用具体的重试策略,参考错误处理章节。 | |
catchRef | CatchRef | 是 | 引用具体的错误捕获策略,参考错误处理章节。 |
Branch 属性
定义并行分支的具体内容,每个分支包含一个处理器:
字段 | 类型 | 是否必选 | 描述 | 示例值 |
---|---|---|---|---|
processor | Processor | 是 | 处理器,定义分支的执行逻辑。 | 见Processor说明 |
Processor 属性
定义分支内的处理逻辑:
字段 | 类型 | 是否必选 | 描述 | 示例值 |
---|---|---|---|---|
startAt | string | 是 | 嵌套状态数组的执行起点。 | ParallelTestBranch1 |
states | array | 是 | 嵌套的状态数组,定义处理逻辑。 |
使用示例
以下示例定义一个并行状态,包含三个分支,每个分支执行HTTP请求,随后跳转至最终状态:
specVersion: '0.8'
version: '1.0'
name: test
start: ParallelTest
states:
- name: ParallelTest
type: Parallel
branches:
- processor:
startAt: ParallelTestBranch1
states:
- name: ParallelTestBranch1
type: Operation
actions:
- functionRef:
type: Http
arguments:
url: https://www.baidu.com/home/feed/feedwater
query:
bsToken: "8e0f5a9e604a945b0a3cada1b0f1b159"
id: "2"
offset: "1"
req_type: "1"
headers:
User-Agent: "apifox"
- processor:
startAt: ParallelTestBranch2
states:
- name: ParallelTestBranch2
type: Operation
actions:
- functionRef:
type: Http
arguments:
url: https://www.baidu.com/home/feed/feedwater
query:
bsToken: "8e0f5a9e604a945b0a3cada1b0f1b159"
id: "2"
offset: "1"
req_type: "1"
headers:
User-Agent: "apifox"
- processor:
startAt: ParallelTestBranch3
states:
- name: ParallelTestBranch3
type: Operation
actions:
- functionRef:
type: Http
arguments:
url: https://www.baidu.com/home/feed/feedwater
query:
bsToken: "8e0f5a9e604a945b0a3cada1b0f1b159"
id: "2"
offset: "1"
req_type: "1"
headers:
User-Agent: "apifox"
transition:
nextState: Final
示例说明
name: 状态名为“ParallelTest”。
type: 状态类型为“Parallel”。
branches: 包含三个分支,每个分支的处理器执行HTTP请求。