跳到主要内容
版本:Next

EndActivity

分类: 通用步骤
命名空间: CMS.Plugin.FlowManagement.Abstractions.FlowBusiness.Activitys
基类: BusinessActivity
模块: FlowManagement.Abstractions

概述

EndActivity 是流程结束节点。当流程运行到结束节点时,将结束整个流程实例,并将流程实例中其他尚未处理的步骤自动结束。结束节点支持自动重启流程,可以实现流程的循环执行。

业务场景

适用场景

  • 流程终止: 标记流程正常结束
  • 循环流程: 流程结束后自动重启,实现循环执行
  • 性能监控: 记录流程总执行时间
  • 流程清理: 自动结束未完成的步骤

在系统中的作用

  • 标记流程执行完成
  • 计算流程总耗时
  • 支持流程自动重启
  • 收集性能指标
  • 清理流程资源

配置说明

基本配置

属性名类型必填默认值说明
AutoResetEventbooltrue步骤执行完后,是否启动一个新的流程实例(重复执行)
NeedTagChangebool?null重启流程后,设置条件以确保只有当变量重新变化时才触发业务处理
EnableCounterbooltrue是否启用性能采样

配置项详解

AutoResetEvent

说明: 控制流程结束后是否自动重启。设置为 true 时,流程结束后会自动创建新的流程实例。

取值范围: true 或 false

注意事项:

  • 适用于需要循环执行的流程(如监控、定时任务)
  • 第一次执行生效
  • 重启时会保留流程上下文数据

NeedTagChange

说明: 控制重启流程时是否需要变量变化才触发。避免重复处理相同的数据。

取值范围: true、false 或 null

注意事项:

  • true: 只有当监控的变量发生变化时才重新执行
  • false/null: 每次重启都执行
  • 可通过流程上下文 NeedTagChange 动态控制

EnableCounter

说明: 是否启用性能计数器,记录流程执行时间到监控系统。

取值范围: true 或 false

注意事项:

  • 用于性能监控和分析
  • 会记录流程总耗时
  • 数据发送到 Metrics 系统

流程上下文

输入参数

参数名类型说明
NeedTagChangebool动态控制是否需要标签变更

输出参数

无特定输出参数

业务逻辑说明

处理流程

  1. 进入节点: 创建工作项并标记为已完成
  2. 结束流程: 调用 FinishFlowAsync 结束流程实例
  3. 停止计时: 停止流程计时器
  4. 记录耗时: 记录流程总执行时间
  5. 重启流程: 如果启用 AutoResetEvent,创建新的流程实例
  6. 性能采样: 如果启用 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 监控性能
    • 确保流程有明确的结束条件

相关节点

常见问题

Q1: 为什么 EndActivity 后面不能再有节点?

A: EndActivity 的 CanExitAsync 永远返回 false,表示流程已经结束,不能再继续执行。

Q2: AutoResetEvent 如何工作?

A: 流程结束后,系统会调用 ResetEventAsync 创建新的流程实例,新实例会从头开始执行。

Q3: NeedTagChange 有什么用?

A: 防止重复处理相同的数据。只有当监控的变量发生变化时,重启的流程才会执行业务逻辑。

Q4: 如何查看流程总耗时?

A: 查看日志中的 "Exit,总耗时:XXX毫秒" 信息,或者在监控系统中查看性能指标。

更新历史

日期版本说明
2025-11-281.0初始版本

本文档最后更新时间: 2025-11-28