当前位置: 首页 > 知识库问答 >
问题:

为什么这种流口水的情况会导致无限循环?

夏青青
2023-03-14

我正在Drools中编写一个规则集,以下情况会通过重新触发规则导致无限循环:

rule "My Rule"
    when
        a1:ObjectA()
        b1:ObjectB(field1 > 0 || a1.field1 in (1,2,3))
        ObjectB(field2 > 10)
    then
        modify( b1 ) { setField3(5) };
end

以下规则更改不会导致无限循环,即当ObjectB中不再引用a1时:

rule "My Rule"
    when
        b1:ObjectB(field1 > 0 || field4 in (1,2,3))
        ObjectB(field2 > 10)
    then
        modify( b1 ) { setField3(5) };
end

另一种不会导致无限循环的情况是当我将||更改为

rule "My Rule"
    when
        a1:ObjectA()
        b1:ObjectB(field1 > 0 && a1.field1 in (1,2,3))
        ObjectB(field2 > 10)
    then
        modify( b1 ) { setField3(5) };
end

从Drools文档中,我了解到调用modify(){}将“触发重新评估知识库中匹配对象类型的所有模式”,但由于我正在修改的字段field3没有在LHS条件中使用,我认为不应该重新评估。然而,我不能肯定这与引用a1有关。字段1位于ObjectB中,但我找不到具体的原因。提前感谢!

共有1个答案

傅朝
2023-03-14

它在对象级别重要,而不是字段级别。由于您修改了a1,该规则将重新计算,因为它依赖于工作内存中的ObjectA对象。注意,文档表明它将“触发对知识库中匹配对象类型的所有模式的重新评估”而不是参数值。

避免这种情况的一种方法是在左侧添加一个像field d3!=5这样的约束。那就是:

rule "My Rule"
when
  a1: ObjectA( field3 != 5 ) // <-- if field3 is already 5, don't fire the rule
  b1: ObjectB(field1 > 0 || a1.field1 in (1,2,3))
  exists(ObjectA(field2 > 10))
then
  modify( a1 ) { setField3(5) };
end

基本上,您需要使规则不再有资格重新启动。

或者,根据您的结构,您可以尝试使用无循环,但这只能防止规则在右侧立即触发时重新引用。如果您有多个修改/更新等,您可能会进入一个“更广泛的”循环场景,其中多个规则会导致重新评估。(例如:规则A进行重新评估,没有循环阻止A再次触发;然后B导致重新评估,因此A可以触发,因为没有循环不适用。)

 类似资料:
  • 我有一个看起来很简单的问题,但由于某种原因我无法绕过它。基本上我的程序正在导致一个无限循环,我不知道为什么。 下面是我陷入的特定循环: 当我运行它时,它总是问我输入列#。我给它一个数字,它接受这个数字,$response变为True,但while循环继续运行,就好像<code>的$response</code>为false一样。我是Perl新手,所以可能我遗漏了一些东西,但是($response=

  • reactive 收集依赖不是要通过 Proxy 触发 get 吗,为什么这里只是打印 obj(没有触发 get),也能够收集到依赖?

  • 我对react钩子和效果有点陌生,在使用useEffect时遇到了问题 上面的代码是我构建的useEffect,用于使用axios获取数据库中的所有数据,并且我将所有数据放在一个称为reports的状态中。 但是当我console.log报告时,它会导致无限循环。我不知道为什么? 让我给你看一个我做的简单动作。 我正在做一个按钮,当它被点击时,报告的状态(按id)将被更新。 这是该州报告结构的样本

  • 问题内容: 因此,当我发现一些非常奇怪的东西时,我正在使用Node.js REPL和Underscore库。如果I ,则该变量是全局设置的(显然)。然后,当我尝试运行一个简单的命令时,它会打印出来(显然,再次)。但是,此后立即运行,因为变量设置为,它会打印。 为什么这样做呢?如果我从js文件运行相同的代码,则不会发生。这是正常的Node事情,还是全部错误? 仅供参考:节点v0.10.10 问题答案

  • 根据Java教程 将包装类型(整数)的对象转换为其相应的基元(int)值称为取消装箱。当包装类的对象为: 作为参数传递给需要相应基元类型的值的方法 分配给相应基元类型的变量 为什么在这种情况下会发生拆箱? 在这种情况下,这些事情发生在哪里?是否有管理数组中元素访问的底层方法?或者[]暗示某种变量?

  • 本文向大家介绍什么情况会导致 kafka 运行变慢?相关面试题,主要包含被问及什么情况会导致 kafka 运行变慢?时的应答技巧和注意事项,需要的朋友参考一下 cpu 性能瓶颈 磁盘读写瓶颈 网络瓶颈