我可以通过编程方式触发drools中的事实更新吗?

时间:2015-08-03 11:24:52

标签: drools

有没有办法以编程方式更新drools中的事实? 我的意思是,而不是像

这样的东西
...
then
    $myFact.setNewValue("newValue");
    update($myFact);

我可以定义一个能够实现我的事实的功能吗? RuleContext(我在那里找不到)或其他一些drools特定的接口来更新事实?

...
    $myFact.setNewValue("newValue");
    myFunction($myFact, someDroolsInterface);

而myFunction将使用someDroolsInterface调用给定事实的更新(或者有任何其他方法来执行此操作作为结果的一部分但没有在drools规则文件本身中)?

这可能吗?

感谢您的任何提示!

1 个答案:

答案 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方法,以便这个事实的查找起作用(因为我没有事实句柄可用)。