EndActivity
分类: 通用步骤
命名空间: CMS.Plugin.FlowManagement.Abstractions.FlowBusiness.Activitys
基类: BusinessActivity
模块: FlowManagement.Abstractions
概述
EndActivity 是流程结束节点。当流程运行到结束节点时,将结束整个流程实例,并将流程实例中其他尚未处理的步骤自动结束。结束节点支持自动重启流程,可以实现流程的循环执行。
业务场景
适用场景
- 流程终止: 标记流程正常结束
- 循环流程: 流程结束后自动重启,实现循环执行
- 性能监控: 记录流程总执行时间
- 流程清理: 自动结束未完成的步骤
在系统中的作用
- 标记流程执行完成
- 计算流程总耗时
- 支持流程自动重启
- 收集性能指标
- 清理流程资源
配置说明
基本配置
| 属性名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| AutoResetEvent | bool | 否 | true | 步骤执行完后,是否启动一个新的流程实例(重复执行) |
| NeedTagChange | bool? | 否 | null | 重启流程后,设置条件以确保只有当变量重新变化时才触发业务处理 |
| EnableCounter | bool | 否 | true | 是否启用性能采样 |
配置项详解
AutoResetEvent
说明: 控制流程结束后是否自动重启。设置为 true 时,流程结束后会自动创建新的流程实例。
取值范围: true 或 false
注意事项:
- 适用于需要循环执行的流程(如监控、定时任务)
- 第一次执行生效
- 重启时会保留流程上下文数据
NeedTagChange
说明: 控制重启流程时是否需要变量变化才触发。避免重复处理相同的数据。
取值范围: true、false 或 null
注意事项:
- true: 只有当监控的变量发生变化时才重新执行
- false/null: 每次重启都执行
- 可通过流程上下文
NeedTagChange动态控制
EnableCounter
说明: 是否启用性能计数器,记录流程执行时间到监控系统。
取值范围: true 或 false
注意事项:
- 用于性能监控和分析
- 会记录流程总耗时
- 数据发送到 Metrics 系统
流程上下文
输入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| NeedTagChange | bool | 动态控制是否需要标签变更 |
输出参数
无特定输出参数
业务逻辑说明
处理流程
- 进入节点: 创建工作项并标记为已完成
- 结束流程: 调用 FinishFlowAsync 结束流程实例
- 停止计时: 停止流程计时器
- 记录耗时: 记录流程总执行时间
- 重启流程: 如果启用 AutoResetEvent,创建新的流程实例
- 性能采样: 如果启用 EnableCounter,记录性能指标
特殊行为
- 永不退出: EndActivity 的 CanExitAsync 永远返回 false
- 自动完成: 工作项自动标记为完成状态
- 清理未完成步骤: 自动结束流程中其他未完成的步骤
性能监控
// 记录流程总耗时
Flow.Instance.Stopwatch?.Stop();
var elapsedMilliseconds = Flow.Instance.Stopwatch?.ElapsedMilliseconds;
// 发送到监控系统
Flow.Metrics.Counter(flowName, elapsedMilliseconds, "ms");
使用示例
基本示例 - 简单结束
{
"Type": "EndActivity",
"Name": "流程结束",
"Alias": "End",
"AutoResetEvent": false,
"EnableCounter": true
}
说明: 流程结束后不重启,记录性能指标。
高级示例 - 循环流程
{
"Type": "EndActivity",
"Name": "循环结束",
"Alias": "LoopEnd",
"AutoResetEvent": true,
"NeedTagChange": true,
"EnableCounter": true
}
说明: 流程结束后自动重启,但只有当监控变量变化时才重新执行。
完整流程示例
{
"Name": "监控流程",
"Activities": [
{
"Type": "VariableMonitorActivity",
"Name": "监控变量",
"Alias": "Monitor"
},
{
"Type": "ProcessDataActivity",
"Name": "处理数据",
"Alias": "Process"
},
{
"Type": "EndActivity",
"Name": "结束并重启",
"Alias": "End",
"AutoResetEvent": true,
"NeedTagChange": true
}
]
}
注意事项
- ⚠️ 唯一性: 每个流程只能有一个 EndActivity
- ⚠️ 永不退出: EndActivity 不能有后续节点
- ⚠️ 循环流程: 使用 AutoResetEvent 时注意避免无限循环
- ⚠️ 性能影响: EnableCounter 会有轻微性能开销
- 💡 最佳实践:
- 循环流程建议启用 NeedTagChange 避免重复处理
- 生产环境建议启用 EnableCounter 监控性能
- 确保流程有明确的结束条件
相关节点
- BusinessActivity: 父类
- ParallelEnd: 并行流程结束节点
常见问题
Q1: 为什么 EndActivity 后面不能再有节点?
A: EndActivity 的 CanExitAsync 永远返回 false,表示流程已经结束,不能再继续执行。
Q2: AutoResetEvent 如何工作?
A: 流程结束后,系统会调用 ResetEventAsync 创建新的流程实例,新实例会从头开始执行。
Q3: NeedTagChange 有什么用?
A: 防止重复处理相同的数据。只有当监控的变量发生变化时,重启的流程才会执行业务逻辑。
Q4: 如何查看流程总耗时?
A: 查看日志中的 "Exit,总耗时:XXX毫秒" 信息,或者在监控系统中查看性能指标。
更新历史
| 日期 | 版本 | 说明 |
|---|---|---|
| 2025-11-28 | 1.0 | 初始版本 |
本文档最后更新时间: 2025-11-28