如果主题令人困惑,那是因为问题本身对我们来说太混乱了。这就是事情。
我们有一个应用程序利用Drools的规则引擎来帮助我们评估java bean - Drool术语中的Fact Objects - 对它们的字段值进行评估,并将bean中的特定标志字段更新为“true”或“false”,具体取决于评价结果。所有评估和更新操作都在模板中定义。
它调用Drools的方式是这样的。首先,它在第一次使用之前创建一个有状态会话。当我们有一个bean列表时,我们将它们逐个插入到会话中,并调用fireAllRules。在触发规则后,我们会保留会话以供以后使用。一旦我们有了另一批豆子,我们会再次一次又一次地做同样的事情......
这听起来很有道理。但是后来在测试期间,我们发现尽管在第一批中,规则引擎工作正常,但以下批次却没有。有些bean被错误更新,即使没有任何字段符合任何规则,标志也更新为true。
然后我们想也许我们不应该重用会话。因此,我们将所有批次的所有豆类放入一个大清单中。但很快我们发现有问题的bean仍然出错更新。更奇怪的是,如果我们在不同的机器上运行此测试,有问题的bean可能会有所不同。但是如果我们在单元测试中测试任何有问题的bean本身,一切正常。
现在我希望我已经解释了这个问题。我们是Drools的新手。也许我们在某个我们不知道的地方做错了什么。这里的任何人都可以给出问题的任何方向吗?那对我们来说非常有利!
答案 0 :(得分:0)
听起来好像你没有在每次'fireAllRules'之后清理工作记忆。
如果您使用有状态会话,那么您插入的每个事实都将保留在工作内存中,直到您明确撤消它为止。因此,每次启动规则时,您都会重新评估原始事实集以及新事实。
为代码添加一些调试可能很有用。使用session.getObjects(),您将能够在执行规则之前和之后查看工作内存中的事实。这应该表明评估之间没有收回的内容。