-1

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

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

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

这听起来很有道理。但后来在测试过程中,我们发现虽然第一批规则引擎运行良好,但后面的批次却不行。一些 bean 被错误地更新了,也就是说,即使没有字段匹配任何规则,标志也被更新为 true。

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

现在我希望我已经解释了这个问题。我们是 Drools 的新手。也许我们在不知道的地方做错了什么。这里有人可以给出问题的任何方向吗?这将是我们一个很大的好处!

4

1 回答 1

0

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

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

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

于 2013-10-27T22:08:24.973 回答