[Drools]事实对象在多阶段规则触发或使用较长的事实对象列表时错误更新

[Drools]事实对象在多阶段规则触发或使用较长的事实对象列表时错误更新,drools,Drools,如果主题令人困惑,那是因为问题本身对我们来说太让人困惑了。事情是这样的 我们有一个应用程序,它利用Drool的规则引擎帮助我们评估java bean(Drool术语中的事实对象)的字段值,并根据评估结果将bean中的特定标志字段更新为“true”或“false”。所有评估和更新操作都在模板中定义 它调用Drools的方式是这样的。首先,它在第一次使用之前创建一个有状态会话。当我们有一个bean列表时,我们将它们逐个插入会话,并调用fireAllRules。触发规则后,我们保留会话以供以后使用。一

如果主题令人困惑,那是因为问题本身对我们来说太让人困惑了。事情是这样的

我们有一个应用程序,它利用Drool的规则引擎帮助我们评估java bean(Drool术语中的事实对象)的字段值,并根据评估结果将bean中的特定标志字段更新为“true”或“false”。所有评估和更新操作都在模板中定义

它调用Drools的方式是这样的。首先,它在第一次使用之前创建一个有状态会话。当我们有一个bean列表时,我们将它们逐个插入会话,并调用fireAllRules。触发规则后,我们保留会话以供以后使用。一旦我们有了另一批豆子,我们就一次又一次地做同样的事情

这听起来很有道理。但是后来在测试过程中,我们发现,尽管在第一批中,规则引擎工作正常,但接下来的批却没有。有些bean被错误地更新,也就是说,即使没有字段与任何规则匹配,标志也被更新为true

然后我们想也许我们不应该重复使用会话。所以我们把所有批次的豆子放在一个大列表中。但是很快我们发现问题bean仍然得到了错误的更新。更奇怪的是,如果我们在不同的机器上运行这个测试,有问题的bean可能会有所不同。但是,如果我们在单元测试中用它自己测试任何有问题的bean,那么一切都可以正常工作


现在我希望我已经解释了这个问题。我们不太会流口水。也许我们在某个不知道的地方做错了什么。这里有人能指出问题的方向吗?那会帮我们一个大忙的

在我听来,好像你没有在每次“fireAllRules”之后清除工作记忆

如果使用有状态会话,则插入的每个事实都将保留在工作内存中,直到显式收回它。因此,每次你启动规则时,你都在重新评估原始事实集,以及新的事实集


在代码中添加一点调试可能会很有用。使用session.getObjects(),您将能够看到在执行规则之前和之后工作内存中有哪些事实。这应该表明评估之间没有收回的内容。

嗨,史蒂夫,谢谢你的指点!我几乎对任何人都能帮上忙失去了希望。事实上,我们也在怀疑同样的事情,但我们找不到正确的方法来清除工作记忆。我们尝试使用“收回”方法,但尽管FactObject计数减少,同样的问题仍然发生。然后我们决定将所有对象放在一个大列表中,并一次性触发规则。不幸的是,我们得到了同样有问题的结果。但是无论如何,我认为按照您的建议检查session.getObjects()是个好主意。我们今天第一件事就是试试。谢谢你的帮助。