Camunda 业务规则任务 (Business Rule Task) 与 DMN 深度解析
·
Camunda 业务规则任务 (Business Rule Task) 与 DMN 深度解析

一、 核心概念定义
1. Business Rule Task(业务规则任务)
- 角色定位:BPMN 流程中的“决策代理人”。它不执行具体的业务动作(如发送邮件),而是负责触发一个决策逻辑并返回结果(这点和网关不同,它类似于一个函数,不控制流)。
- 图形标识:带有表格图标的任务框。
- 核心逻辑:将“怎么走(流程控制)”与“怎么选(业务决策)”分离。
2. DMN (Decision Model and Notation)
- 定义:一种与 BPMN 兼容的标准符号,专门用于描述和建模业务决策。
- 表现形式:最常见为决策表 (Decision Table),逻辑类似 Excel,包含:
- Inputs (输入):判断依据(如:客户年龄、消费金额)。
- Outputs (输出):决策结果(如:折扣比例、是否过审)。
- Rules (规则):每一行代表一个“If-Then”逻辑。
- 命中策略 (Hit Policy):决定当匹配到多条规则时如何处理(如:
Unique唯一命中、Collect累加、First首条命中)。
二、 Business Rule Task 的“技术外壳”属性
虽然 DMN 是其最佳搭档,但 Business Rule Task 本质上是一个多功能的逻辑外壳,支持多种底层实现方案:
| 配置类型 | 实现方式 | 适用场景 |
|---|---|---|
| DMN | 关联 .dmn 文件 | 首选方案。逻辑复杂、经常变动、且希望业务人员能直接看懂/修改。 |
| External | 外部 Worker 订阅 | 微服务架构。逻辑由 Python、Go 或独立微服务实现,与引擎彻底解耦。 |
| Java Class | 编写 Java 代码 | 逻辑极度复杂,需要进行大量底层计算或内存操作。 |
| Expression | ${price * 0.8} | 极简单的数学计算。 |
| Delegate Expression | 调用 Spring Bean | 适合 Spring Boot 环境,方便调用数据库或其他 Service。 |
| Connector | HTTP/REST 请求 | 直接调用第三方风控或规则系统的 API 接口。 |
关键细节:Business Rule Task 与 Service Task 在技术配置上非常相似,但语义化不同。使用 Business Rule Task 能让审计人员通过图纸一眼看出哪里是“决策点”,且在使用 DMN 时,Camunda 能够提供详细的规则命中历史记录。
三、 深度对比:网关 (Gateway) vs. 业务规则任务
在讨论中我们达成共识:Business Rule Task + Gateway 相当于一个高度封装的、复杂的、具备计算能力的“高级网关”。
1. 功能差异
- 网关:分拣员。仅根据现有变量做是非题(Go or No Go),不产生新数据。
- Business Rule Task:加工员。根据输入变量计算出新变量(如:计算运费、确定等级),再交给后续网关使用。
2. 复杂度处理
- 网关嵌套:当面临 3 个以上维度交叉判断时,网关会导致流程图变成“蜘蛛网”。
- DMN 压缩:将数十条
if-else逻辑压缩进一张表格,流程图依然保持简洁。
3. 维护与解耦
- 硬编码风险:在网关连线上写复杂表达式,修改时需改动流程图并重新发布。
- 热更新优势:修改 DMN 文件可独立部署,不影响流程拓扑结构,甚至支持业务人员在线修改。
四、 决策树:我该用哪种方式?
在面临“小计算”和“复杂决策”的选择时,可参考以下判定逻辑:
场景 A:坚持使用网关 (Gateway)
- 分支极少(2-3 个)。
- 逻辑极其稳定,几年不改一次。
- 不产生新的业务变量。
- 例子:判断金额是否大于 100 元。
场景 B:必须使用 Business Rule Task + DMN
- 多维度交叉:例如根据“城市+天气+距离”算运费。
- 逻辑高频变动:例如电商大促期间,折扣规则每周都在变。
- 需要留痕审计:需要事后回溯“为什么当时系统给出了这个结果”。
- 结果复用:计算出的结果需要在后续多个节点中被引用。
五、 操作步骤:如何在 Camunda 中实现
- 建模 DMN:
- 在 Camunda Modeler 中创建 DMN 表。
- 设置
Decision ID(这是关联的关键)。 - 定义输入变量的类型(String, Double 等)和输出变量名。
- 配置 BPMN:
- 拖入 Business Rule Task。
- 在属性面板的
Implementation选DMN。 Decision Ref填入 DMN 的Decision ID。Result Variable定义输出结果存入哪个流程变量。
- 衔接网关:
- 在 Business Rule Task 之后放置一个排他网关。
- 网关连线上根据
Result Variable的值写表达式(例如:${discount == 0.8})。
六、 总结金句
“网关解决的是‘执行流’的去向,而 Business Rule Task 解决的是‘业务知识’的逻辑。”
如果一个逻辑让你在流程图上画出了 3 个以上的菱形网关,或者写出了超过两行的代码表达式,请果断启用 DMN。
更多推荐



所有评论(0)