我可以以编程方式触发 drools 中的事实更新吗?
Can I trigger an update of a fact in drools programmatically?
有没有办法以编程方式更新 drools 中的事实?
我的意思是,而不是像
...
then
$myFact.setNewValue("newValue");
update($myFact);
我可以定义一个函数来接受我的事实吗? RuleContext(我在那儿找不到)或其他一些 drools 特定接口来更新事实?
...
$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 方法,以便事实的查找工作(因为我没有可用的事实句柄)。
有没有办法以编程方式更新 drools 中的事实? 我的意思是,而不是像
...
then
$myFact.setNewValue("newValue");
update($myFact);
我可以定义一个函数来接受我的事实吗? RuleContext(我在那儿找不到)或其他一些 drools 特定接口来更新事实?
...
$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 方法,以便事实的查找工作(因为我没有可用的事实句柄)。