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

在Java代码中访问drool规则细节

糜野
2023-03-14

我是Drools规则引擎的新手。

我创建了一个规则文件,即。drl文件。在该文件中,我定义了三个规则,并使用显著性属性为每个规则分配了优先级。

规则执行后,我想知道已执行的规则的详细信息,例如规则名称、显着值。此外,我想要规则执行的顺序。

谁能帮帮我吗?

共有1个答案

郭修平
2023-03-14

您可以为此使用AgendaEventListener:

import org.drools.event.rule.AfterActivationFiredEvent;
import org.drools.event.rule.DefaultAgendaEventListener;

...
StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
ksession.addEventListener(new DefaultAgendaEventListener() {
    @Override
    public void afterActivationFired(AfterActivationFiredEvent event) {
        AgendaItem item  = (AgendaItem) event.getActivation();
        System.out.println("Name: " + item.getRule().getName() + "; Salience: " + item.getRule().getSalience());
    }
});

事件将针对每个被触发的规则触发
请小心,这可能在将来的版本中不起作用,因为我假设激活是一个代理项对象。我这样做是为了访问显著性(需要访问类而不是接口)。

作为一种完全控制何时记录内容的替代方法,您可以注册跟踪事实并手动调用跟踪方法,如下所示:

import org.drools.rule.Rule;
public class RulesTracking {

    private List<String> tracking = new ArrayList<String>();

    public void track(Rule rule) {
        tracking.add("Name: " + rule.getName() + "; Salience: " + rule.getSalience());
    }

    public List<String> getTracking() {
        return tracking;
    }

}

然后在设置会话的类中,创建跟踪对象并将其注册为“事实”,完成所有处理后,可以输出跟踪结果:

...
rulesTracking = new RulesTracking(); // register this as a "fact"
// more stuff, fireAllRules
System.out.println(rulesTracking.getTracking());
...

最后,您可以在任何需要的地方调用跟踪方法,下面是一条测试规则:

// test rule that fires for every product
rule "TestRule"
salience 100
when
    $product : Product()
    $rulesTracking : RulesTracking()
then
    $rulesTracking.track(drools.getRule()); // here you call your tracking method manually, absolute control
end
 类似资料:
  • 问题内容: 我不明白“无法​​访问的代码”是什么意思? 在我的代码的最后一行中,它表示无法访问的代码。 } 问题答案: 这里的循环: 解析为,因为从未修改过的值。因此,(在您的情况下)之后出现的任何代码均被视为 无法访问 。

  • 问题内容: Xcode 8 beta 4中的新增功能桥接到Swift 协议类型。处理失败的时,这会影响StoreKit 。您应该检查以确保没有发生错误,因为交易被取消了才知道是否向用户显示错误消息。您可以通过检查错误的完成此操作。但是使用代替,没有定义。我还无法弄清楚如何从中正确获取错误代码。 这在Swift 3的先前版本中有效: 现在是一个not ,不是成员。 问题答案: 在xCode 8和Sw

  • 我定义了一些字符串,我可以使用资源表访问。我如何定义和使用复数相似?

  • 每个食谱文档包含三个内容。一个名为的字段,其中存储菜谱的名称;一个名为的字段,其中存储创建者uid的,以及一个名为的子集合,其中包含带有一些随机字段的文档。 问题是,使用这些规则只能创建菜谱文档。子集合及其文档不会创建,因为db表示 FirebaseError:[code=permission-denied]:缺少权限或权限不足。FirebaseError:缺少权限或权限不足。

  • 访问明细分为两部分:表头的时间/设备等分类 和 访问明细情况 1.筛选 可选择某一天某些设备进行筛选,同时具备搜索功能 2.快捷访问(IP)明细情况 包括IP、城市、上站时间、来路、回头客、浏览器和入口网址等信息 3.详细访问(IP)明细情况 1)以日期、时间、IP为标题,采用倒序的逻辑 2)分别列出用户基本信息(城市,此用户第N次访问)、客户端信息(系统+浏览器+分辨率+色彩深度)、来路、