DMN 决策引擎自定义配置
DMN 自定义配置面向决策表解析与规则求值过程。使用 Spring Boot 时,可以把 EngineConfigurationConfigurer<SpringDmnEngineConfiguration> 注册为 Bean,在 DMN 引擎构建前修改决策引擎配置。
@Bean
EngineConfigurationConfigurer<SpringDmnEngineConfiguration> dmnEngineConfigurer() {
return configuration -> {
// 在这里注册决策引擎使用的自定义执行策略
};
}
通过类型参数选择 DMN 配置对象,可以将决策逻辑的扩展与 BPMN 流程配置分开管理。回调在 DMN 引擎完成构建前执行,因此替换或注册的规则执行组件会从引擎初始化后参与决策求值。
DMN 配置中值得关注的项目
| 配置项 | 作用 | 适用场景 |
|---|---|---|
ruleEngineExecutor | 决定决策表规则如何求值,是切换或扩展 FEEL 等规则执行实现的主要入口。 | 需要替代默认执行器、增加表达式能力,或对接自定义规则运行环境。 |
hitPolicyBehaviors | 提供不同命中策略对应的结果处理逻辑。 | 定制执行器时复用当前引擎针对命中策略的处理,保持单命中、多命中结果结构一致。 |
expressionManager | 管理表达式解析及表达式所需的上下文。 | 自定义执行器要解析表达式时,应沿用当前引擎的表达式管理设置。 |
objectMapper | 负责引擎中对象与结构化数据的转换。 | 自定义执行器需要将输入变量、规则结果转换为 DMN API 使用的数据结构时。 |
alwaysUseArraysForDmnMultiHitPolicies | 控 制多命中策略的结果是否总以数组形式表示。 | 调用方需要稳定的结果形状,或正在兼容既有结果格式时。 |
historyLevel | 控制决策执行的历史记录。 | 依据审计和追溯要求平衡可查询信息、存储量与写入开销。 |
自定义规则执行器
当内置规则执行方式不足以满足表达式语言、函数支持或结果处理要求时,可以实现自定义规则执行器,并将其设置到 DMN 引擎配置中。执行器负责按照决策引擎的规则评估决策表,并将结果交还给引擎服务。
实现时应优先复用目标引擎配置中已初始化的协作组件,例如命中策略处理逻辑、表达式管理器和对象映射器。这些组件体现了当前引擎的策略、函数解析和数据转换设置。自行创建一套独立实例可能造成结果处理方式与引擎其他部分不一致。
实现自定义执行器通常需要明确以下边界:
- 支持哪些 DMN 表达式语言及其函数。
- 如何处理不同命中策略,以及多条规则命中时的结果结构。
- 输入变量如何绑定,输出值如何转换为 Flowable 可识别的数据类型。
- 表达式错误、类型不匹配和无命中情况如何报告。
- 自定义执行器如何与 Flowable 版本升级保持兼容。
配置回调适合在初始化阶段,根据当前 DMN 配置组装执行器;下面展示注册关系。执行器实现由应用提供,接口方法和规则运算细节按目标 Flowable 版本实现:
@Bean
EngineConfigurationConfigurer<SpringDmnEngineConfiguration> decisionExecutorConfigurer() {
return configuration -> {
RuleEngineExecutor executor = decisionExecutorFactory.create(
configuration.getHitPolicyBehaviors(),
configuration.getExpressionManager(),
configuration.getObjectMapper()
);
configuration.setRuleEngineExecutor(executor);
};
}
这种方式让执行器复用引擎当前的命中策略、表达式管理和对象转换设置。如果执行器完全独立于引擎内部组件,也可以由 Spring 创建后注入;如果它依赖引擎配置中的组件,则应在回调里创建或通过工厂组装,避免拿到另一套未同步的实例。
初始化顺序
配置回调依赖的协作对象应来自当前 DMN 引擎配置,或来自已初始化的 Spring Bean。不要提前构造尚未就绪的引擎内部组件,也不要在执行器里直接替代 DMN 服务的持久化职责。
可以按以下顺序理解运行过程:
- Spring Boot 创建 DMN 引擎配置。
- Flowable 调用匹配 DMN 配置类型的配置器。
- 配置器注册或替换规则执行组件。
- Flowable 完成 DMN 引擎构建。
- 决策服务使用新执行器评估决策。
因此,这类定制适合在启动时确定执行策略。如果执行器的规则或依赖需要按租户变化,应在设计时明确隔离方式,而不要在多个引擎间共享可变的单例状态。