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

时间:2015-02-19 12:22:09

标签: scala drools

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

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

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

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

(再次,我正在寻找一种解决方法,让Scala和Drools一起工作。)

2 个答案:

答案 0 :(得分:1)

据我所知,您可以使用所需的调整创建对象的副本,然后撤回旧对象并插入新对象。类似于:

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

我希望,这有帮助

答案 1 :(得分:0)

在环顾四周并经历了一些长时间的反复试验后,我意识到FactHandles并没有按照我的预期运作。我的印象是,它们是分配给对象的ID,更新对象意味着它保留了FactHandle(显然不是)。

我通过创建一个新的(Scala)对象并在规则的RHS中运行update来解决这个问题,如下所示:

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

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

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

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

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