当前位置: 首页 > 知识库问答 >
问题:

在drools中,如何通过API访问无状态会话的事实/工作内存?

晏志明
2023-03-14

我可以看到,对于有状态会话,有。

StatefulKnowledgeSessionImpl.getFactHandles() 

如何访问无状态会话的事实句柄?

更多背景:这是一个后续问题:在口水中,我可以从AgendaFilter中访问工作记忆(或任意事实)吗?我正在尝试找到一种从AgendaFilter中访问任意事实的方法。已接受的答案(https://stackoverflow.com/a/34067851/932201)建议将kieSession添加到过滤器中,但我没有提到我正在处理无状态会话。

谢啦!

共有1个答案

史默
2023-03-14

我认为你的问题不连贯,因为我认为不可能将代理过滤器传递给无状态会话的执行方法;没有可用于<代码>的API方法。execute()可以将代理过滤器作为参数传递 编辑:正如注释中所指出的,代理过滤器实际上可以在FireAllRulesCommand中传递。

此外,问题序言有点令人困惑,无状态会话是在您传递事实并在上下文中启动规则评估时创建和处理的,不可能从API访问事实句柄,因为会话已经被处理为您调用。执行(对象...),因此没有更多的事实句柄。

不管怎样-

通过查看您链接的上一个问题的答案,如果您想跟进建议的

更复杂的方法是

正如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);
        }
    }

,虽然您仍然需要根据该答案最后部分提供的@laune示例在每个规则LHS中设置一个条件:

rule "abc"
@uid("1234")
when
  $ruleConfig : RuleConfig(uid="1234", counter > 0)
  // ...
 类似资料:
  • 需要一些帮助!!我对Drools中的有状态和无状态会话没有清晰的理解。我正在努力理解这一点,所以尝试了一个例子。 我在drools6.5版本上使用有状态和无状态会话测试了下面的drl,在这两种情况下都得到了相同的输出。根据我对无状态会话的理解,它应该只执行第一条规则,当应用程序对象在第一条规则中被修改时,第二条规则不应该被激活(“有效期”)。附加源代码。感谢您在这方面的帮助。

  • 我对口水还不熟悉。我试图理解Drools提供的无状态会话和有状态会话之间的区别。 根据我的初步理解, 在无状态会话的情况下,如果在任何规则的操作执行过程中修改了事实,则不会将其重新提交给推理引擎以找出与修改后的事实匹配的新规则。 在状态会话的情况下,如果在任何规则的操作执行过程中修改了事实,则它将被重新提交给推理引擎以找出与修改后的事实相匹配的新规则,然后执行相应的操作。 因此,当我试图通过编写一

  • 如何为drools无状态会话设置全局变量。 假设两个线程访问同一个会话,但为每个线程设置一个全局变量customer arraylist和新的arraylist。对于全局变量customer,第二个线程的arraylist是否替换第一个线程的arraylist。 这似乎是Stateless知识库类留档的情况: 无状态KnowledgeSessions支持全局,其作用域有多种方式。我将首先介绍非命令

  • null null 如果进入房间的人是教师,则输入打印教师。 如果进入房间的人数超过30人,请通知我。 如果学生已上了超过20个小时的课,则更新状态为已完成。 现在我想要1和3组合在一起。 类似:4。如果有属性状态完成的学生进入教室,请通知老师。 现在,正如我前面所说的,这两个事件是分开的。所以在两个不同的规则中处理它更容易。但是当我想创建一个规则,它是规则4中1和3的组合,那么我必须验证一个进入

  • Drools中无状态会话和有状态会话的区别是什么。我浏览了不同的文件,发现下面 无状态会话执行规则时事实的任何更改都不会被规则引擎察觉,因此如果任何规则被修改,则不会发生其他规则的重新激活。 我试图执行下面的规则,发现了相同的结果