首页 文章

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

提问于
浏览
0

我'm currently inserting an object into Drools working memory and running rules on it (creating a new object rather than updating the old one since I'使用Scala immutables ...) . 根据我的理解,通常你会说像 update(myobject) 这样会更新插入的原始变量,让你在规则被触发后在主范围内使用更新的 myObject .

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

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

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

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

2 回答

  • 1

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

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

    我希望,这有帮助

  • 0

    在环顾四周并进行了一些长时间的反复试验之后,我意识到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更新后,我仍然不确定为什么会这样,但我很确定这是因为我对FactHandles的工作方式缺乏了解 . 如果有人愿意在评论中详细说明,我会非常乐意将其添加到答案中,以备将来参考 .

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

相关问题