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

Drools:从LHS模式获取标识符

哈翔
2023-03-14

我正在使用Drools 6.3.0决赛。假设我有这样的规则

rule "Child of Person over 18"
when
    $person : Person(age > 18)
    $child : from $person.children
then
end

让我们进一步假设我用这个规则构建了KieSession,添加了一些事实,现在我想知道所有规则/所有与我的事实匹配的规则中使用的标识符。

所以我想在这里得到的是$人和$孩子。

我知道我可以获取使用AgendaEventListener触发的规则,从事件中我可以获取规则的名称,以及$person和$child的对象。但我没有找到从匹配中获取标识符$person和$child的方法。使用调试器,我可以看到其中的信息。。。实际上,我从事件中得到的规则是一个RuleImpl,它有一个lhsRoot,我可以在其中找到信息。。。但这听起来比实际情况复杂得多,而且不是预期的方式。

所以我想知道是否有更好的方法。

共有1个答案

满元凯
2023-03-14

您的需求可以通过使用Drools的公共API轻松实现。您正在查看正确的位置(AgendaEventListener),但匹配。getObjects()不是您所需要的。您需要的是匹配的组合。GetDeclarationId()(获取标识符列表),然后匹配。getDeclarationValue(字符串id)(获取每个标识符的值)。例如,在控制台中记录此信息的AgendaEventListener的外观如下:

import org.kie.api.event.rule.BeforeMatchFiredEvent;
import org.kie.api.event.rule.DefaultAgendaEventListener;

...

ksession.addEventListener(new DefaultAgendaEventListener() {

    @Override
    public void beforeMatchFired(BeforeMatchFiredEvent event) {

        String ruleName = event.getMatch().getRule().getName();
        List<String> declarationIds = event.getMatch().getDeclarationIds();

        System.out.println("\n\n\tRule: "+ruleName);

        for (String declarationId : declarationIds) {
            Object declarationValue = event.getMatch().getDeclarationValue(declarationId);

            System.out.println("\t\tId: "+declarationId);
            System.out.println("\t\tValue: "+declarationValue);
        }
        System.out.println("\n\n");
    }
});

正如@laune所提到的,您还可以获得一个匹配实例,该实例在规则本身的RHS中激活了一条规则。在这种情况下,可以通过drools访问Match对象。getMatch()。

希望有帮助,

 类似资料:
  • 我正在尝试为Swagger中的项目获取模型模式。我想通过一个http请求来实现这一点,该请求来自不同于托管Swagger的机器。 我可以从以下位置获取作为json的Swagger API文档: 该响应包含: 是否有任何方法获取“/definitions/Item”模型模式? 我想做一个http获取,比如: 我使用的是Swagger 2.0版。 谢谢

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

  • 我对Drools中的流模式有一个问题。我在用这个规则 如果我发送MetaMessage,我希望规则在指定的10秒后执行,但不会附加任何内容。如果我发送新的MetaMessage,10秒后,规则将执行。 编辑:如果我改变规则并去掉not,它就像一个符咒 我不知道我做错了什么。 这就是我创建KieBase的方式 编辑2每次在Kafka队列中插入新的元消息时,我都会使用fireAllRules()触发规

  • 问题内容: 如何从中获取URL片段标识符? 该javadocs中似乎没有提到它。 问题答案: 您无法以您想要的方式获得URL片段。 通常,浏览器不会将片段发送到服务器。可以通过使用网络协议分析器(例如tcpdump,Ethereal,Wireshark和Charles)来验证。 但是,您可以在JavaScript请求中将片段字符串作为GET / POST参数发送。要使用JavaScript获取值,

  • 在有人发疯之前,这件事已经被报道过了,还不是很清楚。首先,我们使用Drools 6.5。接下来,我负责运行引擎的框架,而不是规则。第三,我需要实时报告失败的规则。RHS不成问题,已经解决了。LHS是问题,NPE,除以零,等等,等等。 显然,任何和所有异常都被捕获并相应地处理。据我所知,没有足够的信息来确定失败的规则。我尝试注入一个全局并将其设置为第一stmt,但似乎没有从LHS工作内存复制到应用程

  • 我正在努力使用Hibernate在我的基于Spring的应用程序中启用多租户。我创建了一个自定义实现的和重写的方法来确定租户标识符。当我提供硬编码的租户标识符时,应用程序工作正常。 但是随后出现了一个要求,即根据请求头中的值从数据库默认模式中的表中获取租户标识符。我在许多地方搜索了这个问题,并做了一些打击和试验,但收效甚微。 任何有关这方面的帮助都将不胜感激。请让我知道我需要提供哪些信息来更好地理