在drools中,如何通过API访问无状态会话的事实/工作内存?
我可以看到,对于一个有状态会话,有在drools中,如何通过API访问无状态会话的事实/工作内存?,drools,Drools,我可以看到,对于一个有状态会话,有 StatefulKnowledgeSessionImpl.getFactHandles() 如何访问无状态会话的事实句柄 更多背景: 这是一个后续问题: 我正试图找到一种从代理过滤器中访问任意事实的方法。 接受的答案()建议将会话添加到过滤器中,但我没有提到我正在处理无状态会话 谢谢 我认为你的问题不连贯,因为我认为不可能将AgendaFilter传递给无状态会话的执行方法;没有可用于.execute()的API方法,您可以将AgendaFilter作为参
StatefulKnowledgeSessionImpl.getFactHandles()
如何访问无状态会话的事实句柄
更多背景:
这是一个后续问题:
我正试图找到一种从代理过滤器中访问任意事实的方法。
接受的答案()建议将会话添加到过滤器中,但我没有提到我正在处理无状态会话
谢谢 我认为你的问题不连贯,因为我认为不可能将AgendaFilter
传递给无状态会话的执行方法;没有可用于.execute()
的API方法,您可以将AgendaFilter
作为参数传递EDIT:正如评论中指出的那样,AgendaFilter
实际上可以在fireallrules命令中传递
此外,问题序言有点令人困惑,当您传递事实并上下文启动规则评估时,会创建和处理无状态会话,无法从API访问事实句柄,因为会话已按您所称的.execute(Object…
)进行处理,因此,没有更多的事实处理
反正-
通过查看您链接的上一个问题的答案,以及您是否希望跟进建议的问题
一个稍微复杂一点的方法是
正如user@laune所建议的,通过绑定一个AgendaEventListener
,它可能与下面类似:
kieBase.newStatelessKieSession().addEventListener(new AgendaEventListener() {
@Override
public void afterMatchFired(AfterMatchFiredEvent event) {
final String uid = (String) event.getMatch().getRule().getMetaData().get("uid"); // @uid("1234")
@SuppressWarnings("unchecked") // is unchecked yes, but anyway okay because of ObjecFilter.
Collection<? extends RuleConfig> facts = (Collection<? extends RuleConfig>) event.getKieRuntime().getObjects(object -> {
if (object instanceof RuleConfig) {
return ((RuleConfig) object).getUid().equals(uid);
}
return false;
});
facts.forEach(o -> { o.decrementCounter();});
// trickiest part, because need to signal updated Facts via the facthandles;
for ( RuleConfig rc : facts ) {
FactHandle factHandle = event.getKieRuntime().getFactHandle(rc);
event.getKieRuntime().update(factHandle, rc);
}
}
谢谢@tarilabs的回答。实际上可以传递一个我已经使用过的AgendaFilter(有FireAllRulesCommand,它有一个在中传递AgendaFilter的构造函数)。由于您提到的原因(执行后释放的会话),无法在无状态会话中访问facthandles是有意义的。我会及时更新,以防找到解决方案。你说得对@Sebastian,我错过了。编辑我的答案以反映您的评论。尽管“执行后处理会话->因此facthandles没有公共api”的问题仍然存在;因此,我希望我的回答的第二部分能够有所帮助。
rule "abc"
@uid("1234")
when
$ruleConfig : RuleConfig(uid="1234", counter > 0)
// ...