Apache KIE Drools DMN引擎开发指南
2025-07-07 07:25:56作者:裴锟轩Denise
前言
Apache KIE Drools项目中的DMN引擎是一个强大的决策模型与规则执行引擎,它实现了DMN(Decision Model and Notation)规范。本文将深入解析DMN引擎的核心架构、执行流程以及开发实践指南,帮助开发者更好地理解和使用这一技术。
一、DMN引擎概述
DMN引擎主要负责三个核心功能:
- 编译DMN模型
- 验证模型有效性
- 根据输入数据执行模型评估
引擎支持两种执行模式:
- 静态解释执行(Interpreted)
- 动态代码生成执行(Codegen)
二、核心数据结构
2.1 模型表示类
- Definitions:直接对应DMN XML文件的Java对象表示
- DMNResource:封装Definitions并提供额外资源配置信息
- DMNModel:编译后的高层模型,包含Definitions和所有DMN节点
2.2 抽象语法树(AST)节点
- DMNNode:高层节点,表示业务知识、决策、决策服务等
- BaseNode:底层节点,表示布尔值、字符串等基础元素
2.3 表达式执行相关
- CompiledFEELExpression:可执行的FEEL表达式接口
- ProcessedExpression:编译后的表达式结果,可能包含嵌套子表达式
- DMNExpressionEvaluator:表达式求值功能接口
2.4 执行结果类
- DMNResult:DMN服务调用的完整结果
- DMNDecisionResult:单个决策的评估结果
三、开发实践指南
3.1 模型编译
最简单的编译方式是通过DMNRuntimeUtil工具类:
DMNRuntime runtime = DMNRuntimeUtil.createRuntime("simple-item-def.dmn", this.getClass());
3.2 模型验证
验证DMN模型需要以下步骤:
// 1. 获取验证器
List<DMNProfile> profiles = DMNAssemblerService.getDefaultDMNProfiles(
ChainedProperties.getChainedProperties(ClassLoaderUtil.findDefaultClassLoader()));
DMNValidator validator = DMNValidatorFactory.newValidator(profiles);
// 2. 执行验证
List<DMNMessage> messages = validator.validate(
getFile("dmn14simple.dmn"),
VALIDATE_SCHEMA, VALIDATE_MODEL, VALIDATE_COMPILATION);
3.3 模型执行
执行DMN模型的完整流程:
// 1. 创建运行时
DMNRuntime runtime = DMNRuntimeUtil.createRuntime("simple-item-def.dmn", this.getClass());
// 2. 获取模型
DMNModel dmnModel = runtime.getModel("https://example.com/ns", "simple-item-def");
// 3. 准备输入上下文
DMNContext context = DMNFactory.newContext();
context.set("Monthly Salary", 1000);
// 4. 执行评估
DMNResult dmnResult = runtime.evaluateAll(dmnModel, context);
// 5. 处理结果
DMNDecisionResult decisionResult = dmnResult.getDecisionResultByName("DecisionName");
四、执行流程深度解析
4.1 编译流程
- XML解析:通过DMNProcessor将XML转换为Definitions对象
- 资源封装:将Definitions包装为DMNResource
- 模型编译:DMNCompilerImpl将Definitions编译为DMNNode
- 表达式编译:
- DecisionCompiler处理高层节点
- FEELImpl处理具体表达式
- 生成ProcessedExpression包含可执行代码
4.2 执行流程
- 初始化DMNResult和DMNDecisionResult
- 对每个DecisionNode:
- 标记为EVALUATING状态
- 获取对应的DMNExpressionEvaluator
- 创建EvaluationContext
- 递归执行所有嵌套表达式
- 类型强制转换(Coercion)
- 标记为SUCCEEDED状态并存储结果
4.3 两种执行模式对比
-
解释执行(Interpreted):
- 直接解释执行AST节点
- 启动快,适合开发调试
- 执行效率相对较低
-
代码生成(Codegen):
- 动态生成Java字节码
- 启动慢(需要编译)
- 执行效率高
- 启用方式:
- 添加DoCompileFEELProfile
- 设置CompilerContext.setDoCompile(true)
五、高级特性
5.1 函数调用机制
所有FEEL函数都继承自BaseFEELFunction,调用时:
- 按名称查找函数
- 反射查找匹配的方法
- 使用ScoreHelper评分算法选择最佳匹配
- 执行参数类型强制转换(Coercion)
5.2 类型强制转换(Coercion)
DMN规范定义的自动类型转换规则:
- 数字字符串转BigDecimal
- 单对象转单元素列表
- 其他DMN规范定义的转换规则
六、开发最佳实践
-
性能优化:
- 重要重构后执行基准测试
- 合理使用Codegen模式
- 避免不必要的对象创建
-
代码质量:
- 方法命名清晰自描述
- 方法功能内聚自包含
- 变量命名有意义
- 类职责单一明确
-
测试覆盖:
- 为新功能添加单元测试
- 覆盖边界条件
- 测试异常场景
结语
本文详细剖析了Apache KIE Drools中DMN引擎的核心架构和实现原理,从基础数据结构到完整执行流程,再到高级特性和开发实践。掌握这些知识将帮助开发者更高效地使用DMN引擎构建业务决策系统,也能更深入地参与引擎本身的开发和优化工作。
在实际开发中,建议根据具体场景选择合适的执行模式,遵循DMN规范的同时,也要关注代码的可维护性和性能表现。通过良好的测试覆盖和持续的基准测试,可以确保系统长期稳定高效运行。