有没有办法以编程方式更新drools中的事实? 我的意思是,而不是像
这样的东西...
then
$myFact.setNewValue("newValue");
update($myFact);
我可以定义一个能够实现我的事实的功能吗? RuleContext(我在那里找不到)或其他一些drools特定的接口来更新事实?
...
$myFact.setNewValue("newValue");
myFunction($myFact, someDroolsInterface);
而myFunction将使用someDroolsInterface调用给定事实的更新(或者有任何其他方法来执行此操作作为结果的一部分但没有在drools规则文件本身中)?
这可能吗?
感谢您的任何提示!
答案 0 :(得分:0)
经过一段时间的搜索和调试,我发现有
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方法,以便这个事实的查找起作用(因为我没有事实句柄可用)。