[Drools]事实对象在多阶段规则射击或长事实对象列表期间错误地更新

时间:2013-10-26 11:33:58

标签: drools

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

我们有一个应用程序利用Drools的规则引擎来帮助我们评估java bean - Drool术语中的Fact Objects - 对它们的字段值进行评估,并将bean中的特定标志字段更新为“true”或“false”,具体取决于评价结果。所有评估和更新操作都在模板中定义。

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

这听起来很有道理。但是后来在测试期间,我们发现尽管在第一批中,规则引擎工作正常,但以下批次却没有。有些bean被错误更新,即使没有任何字段符合任何规则,标志也更新为true。

然后我们想也许我们不应该重用会话。因此,我们将所有批次的所有豆类放入一个大清单中。但很快我们发现有问题的bean仍然出错更新。更奇怪的是,如果我们在不同的机器上运行此测试,有问题的bean可能会有所不同。但是如果我们在单元测试中测试任何有问题的bean本身,一切正常。

现在我希望我已经解释了这个问题。我们是Drools的新手。也许我们在某个我们不知道的地方做错了什么。这里的任何人都可以给出问题的任何方向吗?那对我们来说非常有利!

1 个答案:

答案 0 :(得分:0)

听起来好像你没有在每次'fireAllRules'之后清理工作记忆。

如果您使用有状态会话,那么您插入的每个事实都将保留在工作内存中,直到您明确撤消它为止。因此,每次启动规则时,您都会重新评估原始事实集以及新事实。

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