是否有方法以编程方式更新流口水中的事实?我的意思是,而不是像
...
then
$myFact.setNewValue("newValue");
update($myFact);
我可以定义一个函数,将采取我的事实,例如RuleContext(我找不到它在那里)或一些其他口水特定的接口来更新一个事实?
...
$myFact.setNewValue("newValue");
myFunction($myFact, someDroolsInterface);
而myFunction则会使用someDroolsInterface调用给定事实的更新(或者是否有任何其他方法来做到这一点,作为结果的一部分,但没有在drools规则文件本身)?
这可能吗?
谢谢你的建议!
经过一段时间的搜索和调试,我发现有
org.drools.core.spi.KnowledgeHelper
(参见http://javadox.com/org.drools/drools-core/6.2.0.Final/org/drools/core/spi/KnowledgeHelper.html)
允许执行insert()和update()等操作。
我在规则(伪代码!)中使用它,例如,使用总是暴露的"kcontext"RuleContext:
...
then
myService.doSomeServiceCall(kcontext, $myFact1, $myFact2);
在我的服务调用中,我有一些辅助方法,像这样:
protected void updateFacts(final KnowledgeHelper helper, final Object... facts)
{
for (final Object fact : facts)
{
helper.update(fact);
}
}
重要的是,事实正确地实现了equals/hashCode方法,以便对事实进行查找(因为我没有可用的事实句柄)。