从主范围检索 Drools 事实 (Scala)

Retrieving Drools fact from main scope (Scala)

我目前正在将一个对象插入 Drools 工作内存中并对其进行 运行 规则(创建一个新对象而不是更新旧对象,因为我使用的是 Scala 不可变...)。据我了解,通常您会说 update(myobject) 之类的内容,这将更新插入的原始变量,让您在触发规则后在主范围内使用更新的 myObject

由于我正在使用(并插入到内存中)的对象是不可变的,所以我不能简单地修改它们,而且我必须通过稍微调整来创建它们的副本。

有没有办法 return 在规则的 RHS 中创建对象?也许通过调用它的 FactHandle?也对其他解决方法开放...

或者,我可以创建一个新对象 (newObject) 并将其分配给原始对象 (myObject) 的 FactHandle 吗?这会给我所需的访问权限吗?

(再一次,我正在寻找一种使 Scala 和 Drools 协同工作的解决方法。)

据我了解你的问题,你可以创建一个对象的副本,进行你需要的调整,然后收回旧对象并插入新对象。类似于:

val newObject = myObject.copy(foo = "bar");
retract(myObject);
insert(newObject);

希望对你有所帮助

环顾四周并经过长时间的试验和错误后,我意识到 FactHandles 并没有按我预期的方式工作。我的印象是它们是分配给对象的 ID,更新对象将意味着它保留其 FactHandle(显然不是)。

我通过创建一个新的 (Scala) 对象并 运行 在规则的 RHS 中更新如下:

update(kcontext.getKieRuntime().getFactHandle(myObject), newObject)

虽然这在规则触发过程中运行良好,但之后从主应用程序检索对象非常乏味。在触发规则后,对原始对象调用 ksession.getFactHandle(myObject) 返回 null,事实证明,通过从规则中打印出来检查时,该对象的 FactHandle 确实发生了变化。

解决此问题的方法是在触发规则之前保存原始对象的 FactHandle(即 val objectFH = ksession.insert(myObject)),并在触发规则后使用该 FactHandle 调用 .getObject(即使 FactHandle 已保存此变量已更改)。

老实说,由于 FactHandle 在更新时发生变化,我仍然不确定为什么会这样,但我很确定这是因为我对 FactHandle 的工作原理缺乏了解。如果有人愿意在评论中详细说明,我会非常乐意将其添加到答案中以供将来参考。

(感谢@laune 帮助我回到之前的问题)