80.5. 决策引擎中的事实传播模式


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

  • lazy :(默认)事实会在规则执行时传播到批处理集合中,而不是实时传播,因为事实由用户或应用程序单独插入。因此,最终通过决策引擎传播事实的顺序可能与事实单独插入的顺序不同。
  • 即时 :日志会以用户或应用程序插入的顺序立即传播。
  • eager :事实将无限期传播(在批处理集合中),但在规则执行前。决策引擎将此传播行为用于具有 no-looplock-on-active 属性的规则。

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

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

带有被动查询的规则示例

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

rule "Rule"
  when
    $i : Integer()
    ?Q( $i; )
  then
    System.out.println( $i );
end
Copy to Clipboard Toggle word wrap

在本例中,只有在满足查询的 StringInteger 前插入查询时,才应执行该规则,如下例所示:

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

KieSession ksession = ...
ksession.insert("1");
ksession.insert(1);
ksession.fireAllRules();
Copy to Clipboard Toggle word wrap

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

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

在同一示例规则中,只有在 Integer 之前插入查询的字符串时,才会对规则进行评估,如预期所示:

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

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

rule "Rule" @Propagation(IMMEDIATE)
  when
    $i : Integer()
    ?Q( $i; )
  then
    System.out.println( $i );
end
Copy to Clipboard Toggle word wrap

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat