首页
/ Apache KIE Drools DMN引擎开发指南

Apache KIE Drools DMN引擎开发指南

2025-07-07 07:25:56作者:裴锟轩Denise

前言

Apache KIE Drools项目中的DMN引擎是一个强大的决策模型与规则执行引擎,它实现了DMN(Decision Model and Notation)规范。本文将深入解析DMN引擎的核心架构、执行流程以及开发实践指南,帮助开发者更好地理解和使用这一技术。

一、DMN引擎概述

DMN引擎主要负责三个核心功能:

  1. 编译DMN模型
  2. 验证模型有效性
  3. 根据输入数据执行模型评估

引擎支持两种执行模式:

  • 静态解释执行(Interpreted)
  • 动态代码生成执行(Codegen)

二、核心数据结构

2.1 模型表示类

  1. Definitions:直接对应DMN XML文件的Java对象表示
  2. DMNResource:封装Definitions并提供额外资源配置信息
  3. DMNModel:编译后的高层模型,包含Definitions和所有DMN节点

2.2 抽象语法树(AST)节点

  1. DMNNode:高层节点,表示业务知识、决策、决策服务等
  2. BaseNode:底层节点,表示布尔值、字符串等基础元素

2.3 表达式执行相关

  1. CompiledFEELExpression:可执行的FEEL表达式接口
  2. ProcessedExpression:编译后的表达式结果,可能包含嵌套子表达式
  3. DMNExpressionEvaluator:表达式求值功能接口

2.4 执行结果类

  1. DMNResult:DMN服务调用的完整结果
  2. 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 编译流程

  1. XML解析:通过DMNProcessor将XML转换为Definitions对象
  2. 资源封装:将Definitions包装为DMNResource
  3. 模型编译:DMNCompilerImpl将Definitions编译为DMNNode
  4. 表达式编译
    • DecisionCompiler处理高层节点
    • FEELImpl处理具体表达式
    • 生成ProcessedExpression包含可执行代码

4.2 执行流程

  1. 初始化DMNResult和DMNDecisionResult
  2. 对每个DecisionNode:
    • 标记为EVALUATING状态
    • 获取对应的DMNExpressionEvaluator
    • 创建EvaluationContext
    • 递归执行所有嵌套表达式
    • 类型强制转换(Coercion)
    • 标记为SUCCEEDED状态并存储结果

4.3 两种执行模式对比

  1. 解释执行(Interpreted)

    • 直接解释执行AST节点
    • 启动快,适合开发调试
    • 执行效率相对较低
  2. 代码生成(Codegen)

    • 动态生成Java字节码
    • 启动慢(需要编译)
    • 执行效率高
    • 启用方式:
      • 添加DoCompileFEELProfile
      • 设置CompilerContext.setDoCompile(true)

五、高级特性

5.1 函数调用机制

所有FEEL函数都继承自BaseFEELFunction,调用时:

  1. 按名称查找函数
  2. 反射查找匹配的方法
  3. 使用ScoreHelper评分算法选择最佳匹配
  4. 执行参数类型强制转换(Coercion)

5.2 类型强制转换(Coercion)

DMN规范定义的自动类型转换规则:

  • 数字字符串转BigDecimal
  • 单对象转单元素列表
  • 其他DMN规范定义的转换规则

六、开发最佳实践

  1. 性能优化

    • 重要重构后执行基准测试
    • 合理使用Codegen模式
    • 避免不必要的对象创建
  2. 代码质量

    • 方法命名清晰自描述
    • 方法功能内聚自包含
    • 变量命名有意义
    • 类职责单一明确
  3. 测试覆盖

    • 为新功能添加单元测试
    • 覆盖边界条件
    • 测试异常场景

结语

本文详细剖析了Apache KIE Drools中DMN引擎的核心架构和实现原理,从基础数据结构到完整执行流程,再到高级特性和开发实践。掌握这些知识将帮助开发者更高效地使用DMN引擎构建业务决策系统,也能更深入地参与引擎本身的开发和优化工作。

在实际开发中,建议根据具体场景选择合适的执行模式,遵循DMN规范的同时,也要关注代码的可维护性和性能表现。通过良好的测试覆盖和持续的基准测试,可以确保系统长期稳定高效运行。