异步任务组件
异步任务组件(Async)用于把耗时的后续流程放到后台异步执行,让接口提前返回,避免调用方长时间等待。
概述
当一个接口后的流程包含批量处理、报表生成等耗时操作时,同步执行会阻塞用户操作。异步任务组件插入流程后,其之后的节点转入后台执行,接口在到达该组件时即可返回,任务在后台继续运行。
异步任务支持两种执行模式:
| 模式 | 值(AsyncMode) | 说明 |
|---|---|---|
| 后台执行 | Background | 后续流程在后台静默执行,不展示进度 |
| 进度执行 | Progress | 后续流程在后台执行,并向用户展示执行进度 |
选择「进度执行」时可额外填写任务名称(TaskName),作为进度提示的标题;留空时使用通用名称。
异步任务只有出现在流程中才生效,通常放在「开始」之后、耗时业务组件之前。它属于高级组件分类(Senior),在接口画布的高级组件分组中,不在基础组件分组。
配置项
| 配置项 | 说明 |
|---|---|
执行模式(AsyncMode) | 后台执行 / 进度执行 |
任务名称(TaskName) | 仅「进度执行」模式显示,作为进度标题,可空 |
执行流程
使用场景
- 数据批量导入/导出
- 报表生成
- 数据同步
- 批量消息发送
下一步
属性明细
以下内容面向技术实现与 AI 检索,说明异步任务组件的节点元数据。
节点元数据
异步任务组件由 FlowCmpType.Async 标识:
| 属性名 | 类型 | 含义 | 取值/存储值 |
|---|---|---|---|
type | string | 组件类型 | 固定为 "Async" |
AsyncMode | string | 执行模式 | "Background"(缺省)/ "Progress" |
TaskName | string | 任务名称 | 进度执行模式下的标题,可空 |
order | string | 同级排序 | 例:"2" |
元数据存储示例
{
"ID": "async1",
"type": "Async",
"AsyncMode": "Progress",
"TaskName": "批量生成报表",
"order": "2"
}
服务端执行逻辑
异步任务组件由 AsyncComponentManager(继承 InterfaceComponentManagerBase)实现,组件类型为 FlowComponentTypeEnum.Async。
节点
meta中的所有值均以字符串存储,服务端统一通过SafeGet("Key")读取字符串后再按需转换类型。
执行时机与场景
当接口流程执行到异步任务节点时触发。若当前上下文已被异步任务接管(context.TinyTaskContext != null),说明该链路已在后台任务中运行,组件不再重复入队,直接同步执行下游。
输入参数(meta 键)
| 键 | 读取方式 | 含义 |
|---|---|---|
AsyncMode | meta.SafeGet("AsyncMode") | "Progress" 表示进度模式;其余值(含缺省)按后台模式处理 |
TaskName | meta.SafeGet("TaskName") | 进度模式任务名称,空白时使用本地化默认名 |
IsDisabled | meta.SafeGet("IsDisabled") == "true" | 为 true 时跳过本组件,直接执行下游 |
执行步骤
- 读取
AsyncMode。 - 若
context.TinyTaskContext != null,直接调用ExecuteNextAsync执行下游并结束。 - 进度模式(
AsyncMode == "Progress"):TaskName为空时取本地化默认任务名;- 调用
ITinyTaskHelper.StartTask(taskName, taskContext => { context.TinyTaskContext = taskContext; return ExecuteNextAsync(context); }),把下游链路作为后台任务入队; - 返回新上下文
new ComponentContext { InterfaceId = context.InterfaceId, Result = ResponseResult.Success() },并把Result.taskId设为任务 Id。
- 后台模式(缺省或其它值):调用
_ = ExecuteNextBackgroundAsync(context)触发即忘(fire-and-forget)后台执行,立即返回ResponseResult.Success()。
后台任务的入队由 TinyTaskHelper.StartTask 完成:先将 TinyTaskInfo(含任务 Id)以 TinyTask_{taskId} 为键写入缓存(6 小时过期),序列化当前 ChameleonContext,随后在 Task.Run 新建的 DI Scope 中还原上下文并执行 taskAction;任务进度通过 TinyTaskContext.UpdateProgress / Complete / CompleteWithError 回写。
输出与上下文
- 返回的上下文使用新的
ComponentContext(仅带InterfaceId与Result),避免与后台线程共享同一上下文。 - 进度模式下
Result.taskId为后台任务 Id,调用方可用它查询进度。 - 后台线程中的下游组件仍在原
context上写入CmpResult、Result、DicParam。 ExecuteNextAsync在TinyTaskContext存在时会以context.TinyTaskContext.ServiceProvider覆盖ServiceProvider,保证后台链路使用同一容器。
权限、安全与限制
- 组件自身不做权限校验,也不使用
IsFinalResult。 - 后台模式下的异常不会抛给调用方,仅记录错误日志(含
TenantId/UserId/InterfaceId)。 - 任务信息缓存有效期为 6 小时。
- 框架级限制:链路递归深度超过 100 会抛出异常。
异常与校验
- 校验期仅调用
VerifyNextAsync,不校验AsyncMode/TaskName。 - 下游节点缺失由
GetNextList抛出异常。