从主作用域(Scala)检索Drools事实



我目前正在将一个对象插入Drools工作内存并在其上运行规则(创建一个新对象,而不是更新旧对象,因为我使用的是Scala免疫表…)。据我所知,通常你会说update(myobject)之类的话,它会更新插入的原始变量,允许您在触发规则后在主作用域中使用更新的myObject

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

有没有一种方法可以返回在规则的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)

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

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

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

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

最新更新