83.5. 在决策引擎中事实传播模式

决策引擎支持以下事实传播模式,决定决策引擎如何通过引擎网络插入事实,以准备规则执行:

  • lazy:(Default)事实在规则执行时传播到批处理集合,而不是实时由用户或应用插入事实。因此,通过决策引擎传播事实的顺序可能与直接插入事实的顺序不同。
  • 即时 :事实会立即按照用户或应用程序插入的顺序立即传播。
  • eager: 事实在批处理集合中传播(在批处理集合中),但在规则执行前。决策引擎将这种传播行为用于具有 no-looplock-on-active 属性的规则。

默认情况下,决策引擎中的 Phreak 规则算法使用 lazy fact propagation 来改进规则评估整体。然而,在一些情况下,这种 lazy Propagation 行为可能会改变某些可能需要立即或立即传播的某些规则执行的结果。

例如,以下规则使用带有 ? 前缀的指定查询以拉取或被动方式调用查询:

带有被动查询的规则示例

query Q (Integer i)
    String( this == i.toString() )
end

rule "Rule"
  when
    $i : Integer()
    ?Q( $i; )
  then
    System.out.println( $i );
end

在本例中,只有在满足查询在 Integer 前插入的 String 的字符串时才执行该规则,例如以下示例命令中:

应该触发规则执行的命令示例

KieSession ksession = ...
ksession.insert("1");
ksession.insert(1);
ksession.fireAllRules();

但是,由于 Phreak 中默认的 lazy Propagation 行为,决策引擎不会检测到本例中两个事实的插入序列,因此无论 StringInteger insertion 顺序如何,都执行此规则。在本例中,预期规则评估需要立即传播。

要改变决策引擎传播模式来实现预期的规则评估,您可以将 @Propagation(<type>) 标签添加到您的规则,并将 < type > 设置为 LAZYIMMEDIATEEAGER

在同一示例规则中,即时传播注解允许仅在满足查询条件的 StringInteger 前插入,以如预期一样评估规则:

带有被动查询和指定传播模式的规则示例

query Q (Integer i)
    String( this == i.toString() )
end

rule "Rule" @Propagation(IMMEDIATE)
  when
    $i : Integer()
    ?Q( $i; )
  then
    System.out.println( $i );
end