首页 文章

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

提问于
浏览
-1

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

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

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

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

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

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

1 回答

  • 0

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

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

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

相关问题