80.5. 决策引擎中的事实传播模式
决策引擎支持以下事实传播模式,它决定了决策引擎如何通过引擎网络完成插入的事实以准备规则执行:
- lazy :(默认)事实会在规则执行时传播到批处理集合中,而不是实时传播,因为事实由用户或应用程序单独插入。因此,最终通过决策引擎传播事实的顺序可能与事实单独插入的顺序不同。
- 即时 :日志会以用户或应用程序插入的顺序立即传播。
-
eager :事实将无限期传播(在批处理集合中),但在规则执行前。决策引擎将此传播行为用于具有
no-loop
或lock-on-active
属性的规则。
默认情况下,决策引擎中的 Phreak 规则算法使用 lazy 事实传播来改进规则评估。然而,在一些情况下,这种 lazy 传播行为可能会改变某些需要立即或 eager 传播的规则执行的预期结果。
例如,以下规则使用带有 ?
前缀的指定的查询,以仅拉取或被动方式调用查询:
带有被动查询的规则示例
在本例中,只有在满足查询的 String
在 Integer
前插入查询时,才应执行该规则,如下例所示:
应该触发规则执行的命令示例
KieSession ksession = ... ksession.insert("1"); ksession.insert(1); ksession.fireAllRules();
KieSession ksession = ...
ksession.insert("1");
ksession.insert(1);
ksession.fireAllRules();
但是,由于 Phreak 中的默认 lazy 传播行为,决策引擎不会检测到两个事实的插入序列,因此无论 String
和 Integer
插入顺序是什么,都会执行该规则。在本例中,预期规则评估需要立即传播。
要更改决策引擎传播模式以实现预期的规则评估,您可以在规则中添加 @Propagation (<type>)
标签,并将 < type
> 设置为 LAZY
、IMMEDIATE
或 EAGER
。
在同一示例规则中,只有在 Integer
之前插入查询的字符串时,才会对规则进行评估,如预期所示:
带有被动查询和指定的传播模式的规则示例