需要实施 Drools 规则的设计指南

Need design guidance for implementing Drools rules

我在我的应用程序中使用 Drools 6.1.0。

我们计划编写一个包含所有规则的巨大 .drl 文件。

主要有两类规则 1.空检查 2. 业务验证

使用 ruleflow-group、activation-group 和 salience 我计划管理在将事实添加到会话时要执行/触发的规则。

即使使用这种方法,解决方案也不适合我,因为。

假设我有以下 .drl 文件

rule "rule1"
ruleflow-group "primary"
activation-group "NullCheck"
salience 5
when 
    $m : Message(innerMsg.something == null)
then 
    // do something

rule "rule2"
ruleflow-group "primary"
activation-group "NullCheck"
salience 4
when 
    $m : Message(innerMsg.something.something == null)
then 
    // do something

rule "rule3"
ruleflow-group "primary"
activation-group "NullCheck"
salience 3
when 
    $m : Message(innerMsg.something.something.something == null)
then 
    // do something

Drools 文档这样说 "All constraints are evaluated when a fact is inserted. From the Drools manual: The condition evaluation is not tied to a specific evaluation sequence or point in time, but that it happens continually, at any time during the life time of the engine."

所以正在发生的事情是执行此文件的代码在规则 2 上抛出 Nullpointer 异常,因为 innerMsg.something.something 为 NULL

注意:我不想使用 || 组合所有空检查在单个 when 语句中,因为我想捕获特定的空条件并基于该条件创建错误消息。

我的问题如下。

  1. 使用 drools 规则对链接对象执行 Nullchecks 是个好主意吗?
  2. 我是否应该使用其他东西,比如顺序规则执行(不确定在 Drools 中是否可用)这将允许我按特定顺序执行规则。
  3. 还有其他方法可以实现吗

我认为 http://drools-moved.46999.n3.nabble.com/rules-users-Drools-Activation-Group-td3546598.html 可能与您所看到的内容相关。您可以尝试以下操作。

rule "rule2" ruleflow-group "primary" activation-group "NullCheck" salience 4 when $m : Message(innerMsg != null) Message(this == $m, innerMsg.something != null) Message(this == $m, innerMsg.something.something == null) then

这违背了你避免一堆 || 的愿望。在一定程度上,但它是一种不同的语法。

您无法避免的是使用使您的代码空安全。

要么为每个条件添加前缀以访问具有空测试的 Object 子类型的字段:

Fact( field != null && field.subfield == whatsoever )

或者您使用空安全解引用运算符:

Fact( field!.subfield == whatsoever )

请注意 ==!= 是隐式空安全的,因此您可以写

Fact( field == whatever )

没有问题如果 field == null

尽快放弃使用activation-group和salience来实现流量控制的想法。它会导致非常糟糕的规则设计、不可维护的代码和普遍的不满。如果不会,请用 Java 或其他语言全部写下来。