- 简介
- 入门指南
- 流程建模
- 流程实施
- 流程运营
- 流程监控
- 流程优化
- 参考信息
Maestro 用户指南
概述
使用标记配置任务,使“列表”变量中的每个元素运行一次,从而创建多次顺序或并行执行。访问“BPMN 入门”章节中的“标记”,获取标记和概念指导。
何时使用多实例标记
当您有一个项目列表并且需要为每个项目运行一次同一任务时,请使用多实例标记 — 例如:
- 验证发票 ID 列表中的每个发票
- 通过为每条记录调用外部 API,丰富一组记录
- 向列表中的每位收件人发送通知
如果没有标记,您需要使用序列流构建手动循环,这样更难读取和跟踪。多实例标记有助于保持流程图的简洁,并在执行追踪记录中查看每个项目的状况。每个项目的运行情况都会单独显示,并显示各自的状态和输出。
如果注重顺序或每次运行都依赖于上一次运行,请使用“顺序”模式。如果项目相互独立且希望达到更大的吞吐量,请使用“并行”模式。
支持的集合类型
Maestro 将以下集合类型视为可循环的多实例执行。如果您的变量是以下类型之一,则可以直接在“项目”字段中使用它:
System.Collections.Generic.List<T>System.Collections.Generic.IList<T>System.Collections.Generic.IEnumerable<T>System.Collections.IEnumerableSystem.Data.DataTableNewtonsoft.Json.Linq.JArraycollectionDataType以List为开头的类型collectionDataType以Array为开头的类型- 原始 .NET 数组,例如
int[]、string[]、、bool[]、double[]、decimal[]、long[]
保持每个项目的工作幂等且持续时间短。如果您需要在所有迭代完成后将结果收集到单个变量,请使用“输出”和“更新变量”部分。
如何添加多实例标记
在将任务转换为多实例任务之前,请配置任务的“操作” 。多实例配置会在您应用标记时绑定到任务的输出。如果此时未选择任何操作,则绑定将绑定到任务的默认输出占位符,而不是操作的实际输出,之后选择操作不会刷新此绑定。然后,每次迭代都会写入未绑定的输出,从而在运行时在聚合变量中生成null条目。如果您已经先将任务转换为多实例任务,请参阅聚合变量包含空值,以获取取消设置的解决方法并重新应用。
-
在画布上选择一个任务,并在“属性”面板中配置其“操作” 。确认“输出”部分反映了您选择的操作,例如,智能体操作公开类型化的
response输出和Error输出。仅在输出部分与操作匹配后继续。 -
在任务上方的元素工具栏中,选择“更改元素”。
-
选择“顺序多实例”或“并行多实例”。
标记将显示在任务形状的底部。
-
在“属性”面板中,展开“多实例”。
-
在“项目”中,选择您要迭代的列表变量,例如
vars.invoiceList。这会指示 Maestro 要处理哪个集合。若无“项目”值,任务将作为常规任务运行一次,而非每个元素运行一次。Maestro 为列表中的每个元素创建一次执行。
-
可以选择性地展开“错误处理”并启用“失败时重试”,以独立重试各个项目运行。有关配置选项,请参阅“元素级重试”。
只有任务支持多实例。您选择的标记类型(顺序或并行)将决定执行顺序。
引用当前项目
“多实例”部分仅需要“项目”列表,您可以在其中指示 Maestro 要迭代哪个集合。迭代器表达式会进入不同的位置:任务的“输入”部分,每次运行时,都会将当前项目映射到特定输入。
您使用的表达式取决于标记是直接应用于任务,还是任务在从多实例任务调用的子流程中运行。
| 场景 | 表达式 | 使用位置 |
|---|---|---|
| 直接应用于任务的标记 | iterator.item | 在任务的“输入”字段中 |
| 任务在从多实例任务调用的子流程中运行 | iterator[0].item | 在子流程任务的“输入”字段中 |
iterator[0].item 中的 [0] 是指任务在子流程中运行时的最外部的迭代器作用域。在标准单级多实例中,您将始终使用 [0],没有 iterator[1]。
要传递当前的整个元素,请使用 iterator.item。要传递单个属性,请使用 iterator.item.propertyName。以下是相关示例:
iterator.item.invoiceIditerator.item.customer.email{ id: iterator.item.id, flags: ["recheck"] }
引用任务中的当前项目
将多实例标记直接应用于任务时,请在“属性”面板的“输入”部分使用 iterator.item,将当前元素传递到每次运行。
“属性”面板引用
-
操作:选择任务的运行方式(Integration Service 操作、智能体操作,如果仅用于建模,则为“无”)。
-
输入:显示由所选操作定义的参数。对于要填充当前列表项目的每个参数,如需传递整个元素,请将其值设置为
iterator.item,如需传递特定属性,请设设置为iterator.item.propertyName。 -
输出:定义每次迭代返回的内容。为任务配置操作后,该操作的输出(通常为
response,对于智能体操作为Error)将自动显示在此处,并且每个输出通过“值芯片”与其来源绑定。要在每次迭代中除了操作的输出之外添加额外值,请选择“+ 添加新值”并为其命名。如果此处列出的条目未反映您的操作公开的内容(例如,值芯片显示通用占位符类型,而不是操作的实际输出类型),请参阅聚合变量包含 null 值。 -
更新变量:所有迭代完成后,指定哪个流程变量存储聚合输出。选择“设置变量值” ,然后选择目标变量,例如
vars.validationResults。该变量保存一个数组,每次迭代只有一个条目:如果每次迭代返回字符串,则为字符串数组;如果每次迭代返回对象,则为对象数组。在顺序模式下,条目遵循输入的顺序。在并行模式下,顺序与迭代完成的顺序相同,但无法保证顺序。
在子流程中引用当前项目
当任务在从多实例任务调用的子流程中运行时,当前项目无法直接作为 iterator.item 使用。相反,请在子流程任务的“输入”中使用 iterator[0].item,访问从父多实例任务传递的元素。
“属性”面板引用
-
操作:配置任务与外部系统、API 或智能体交互的方式。
-
输入:为任务所需的每个值添加输入。如需传递当前的整个元素,请将值设置为
iterator[0].item,如需传递特定属性,则设置为iterator[0].item.propertyName。示例 — 如果您的列表包含带有
id字段的对象,请在“属性”面板的“输入”部分添加一个条目:- 输入字段名称:
currentItemId - 值:
iterator[0].item.id
将
.id替换为列表对象中的实际属性名称。 - 输入字段名称:
示例
示例:验证发票列表
此示例显示如何配置“服务”任务,以便为列表中的每个发票运行一次任务。
1. 准备一个列表变量
- 打开“数据管理器”。
- 创建变量:
- 名称:
invoiceList - 类型:对象数组或字符串数组
- 默认值:
["INV-001", "INV-002", "INV-003"]
- 名称:
2. 添加“服务”任务并配置操作
-
将“服务”任务添加到画布,并将其命名为“验证发票”。
-
选中任务后,打开“属性”面板中的“操作”部分,并配置为每张发票运行的智能体:
- 操作:选择“开始并等待智能体“。
- 智能体:选择负责验证发票的智能体。智能体必须已存在于您的租户中。您可以在 Agent Builder 中创建智能体。
-
确认“输出”部分反映了智能体操作 —
response输出应及其实际输出类型与Error一起出现。仅在与此匹配后继续。
3. 将任务转换为多实例任务
- 选定任务后,打开元素工具栏并选择更改元素→顺序多实例。
- 在“属性”面板中,展开“多实例”然后将“项目”设置为
vars.invoiceList。
4. 将当前项目映射到输入
选择操作后,“输入”部分将显示该操作定义的参数,例如 RPA 工作流的输入参数或智能体的参数。
对于要使用当前列表项目填充的每个参数,选择其值字段并输入iterator.item :
- 如需传递当前的整个元素,请使用
iterator.item,例如字符串"INV-001"(如果您的列表包含字符串)。 - 如需传递特定属性,请使用
iterator.item.propertyName,例如iterator.item.id(如果您的列表包含对象)。
5. 调试流程
- 选择“调试”→“分步调试”。
- Maestro 会为每个列表项目运行一次“验证发票”。
结果:执行追踪记录会显示每张发票运行一次,每次都会标记其项目值。
要同时而不是按顺序运行所有项目,请在步骤 2 中选择“并行多实例”。另请参阅下面的扇出示例。
示例:扇出并收集结果
场景:您从外部 API 收到发票 ID 的列表,需要独立验证每个 ID,然后在下游步骤中使用汇总结果。
-
确保列表变量(例如
vars.invoiceIds)由上一个步骤填充,例如调用外部 API 的“服务”任务。 -
添加名为“验证发票”的服务任务,并在常规任务中配置验证单个发票的操作。确认“输出”部分反映了操作 —
response条目应显示操作的实际输出类型。 -
选定任务后,选择“更改元素” → “并行多实例” 。
-
在“多实例”部分中,将“项目”设置为
vars.invoiceIds。 -
在“输入”部分中,将
iterator.item映射到操作的发票 ID 参数 — 例如,将invoiceId输入设置为iterator.item。 -
在“输出”部分中,验证操作的
response输出是否已列出并且绑定到操作的结果。如果每次迭代都需要额外的聚合值,请选择“+新增”并进行定义。如果列出的输出与您的操作公开的输出不匹配,则表示在配置操作之前应用了标记;请参阅聚合变量包含空值。 -
在“更新变量”部分中,选择“设置变量值” ,然后选择用于存储聚合结果的变量,例如
vars.validationResults。所有迭代完成后,每个发票的此变量包含一个条目 — 如果您的操作返回字符串,则为字符串数组;如果您的操作返回对象,则为对象数组。
运行时行为
- 扇出/扇入:Maestro 为每个项目创建一个活动实例,并在所有实例完成后完成组。
- 排序:在“顺序”模式下保证;在“并行”模式下不保证。
- 并发:并行模式会并发运行项目,受平台限制和资源可用性的约束。
- 失败:每个项目的结果都是独立的。定义下游逻辑,用于处理部分失败(例如,根据阈值继续、重试或停止)。
- 可观察性:每次项目运行都在执行追踪记录中单独跟踪,显示每个项目的状态和结果。
故障排除
聚合变量包含 null 值
即使每次迭代都成功运行,由“更新变量”生成的聚合变量在每次迭代时都包含null (例如[null, null, null] )。
当在选择其“操作”之前将任务转换为多实例时,会发生这种情况。多实例配置已绑定到任务的默认输出占位符,而不是操作的实际输出,之后选择操作不会刷新此绑定。每次迭代都会写入未绑定的输出和聚合器记录null 。
要修复现有任务:
- 在元素工具栏中,选择“更改元素” ,然后将任务转换回常规任务。
- 确认已选择操作,并且确认“输出”部分反映了该操作(例如,操作输入
response,加上智能体操作Error)。 - 使用“更改元素” → “顺序多实例”或“并行多实例”再次将任务转换为多实例。
- 在“输出”部分中,验证条目仍与操作的输出匹配。
为防止在新任务上出现这种情况,请务必在将任务转换为多实例任务之前配置操作。
项目输入将被忽略,任务运行一次
该任务运行一次,并且“项目”值被视为常规输入。
当传递给项目的变量不是受支持的集合类型之一时,就会发生这种情况。根据“支持的集合类型”检查数据管理器中的变量类型。如果您已将列表定义为纯字符串,请将其转换为字符串数组或对象数组。
输出条目未反映操作的输出
“输出”部分不会显示您期望从所选操作中获得的条目——例如,智能体操作应该公开response和Error ,但只显示通用的response占位符。
在所选择的操作完成传播之前捕获输出。通过更改元素→ 常规任务取消多实例标记,确认输出部分反映操作,然后重新应用标记。
最佳实践
- 在扇出之前验证集合(检查空、null 或过大的列表)。
- 保持每个项目的工作时间短且具有容错功能。在适当的情况下添加重试。
- 仅聚合您需要的内容。 大型聚合可能会影响性能和可读性。
- 明确成功标准。多实例任务完成后,添加“排他网关”,用于评估聚合输出变量,例如,只有成功结果数量达到阈值时,才会路由到下一个步骤。
并行多实例以 50 个为一组执行元素。如果每个项目是大型或复杂对象(多个键值对或嵌套结构),也请确保集合总大小低于 50,因为项目大小会影响可以并发维持的数量。
在子流程或调用活动中工作? 有关变量作用域、输入/输出映射和“结束事件”变量,请参阅“子流程”。