从主范围检索 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 帮助我回到之前的问题)
我目前正在将一个对象插入 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 帮助我回到之前的问题)