在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)
  // ...