Drools-如何找出所有规则都匹配了?

2024-03-05

我有一个 .DRL 文件,其中有 10 条规则。一旦我插入一个事实,一些规则可能会被匹配 - 我如何找出以编程方式匹配的规则?


请注意,此答案对于 Drools 5.x 及以下版本有效。如果您已转到 6 或更高版本,请查看 @melchoir55 修改后的答案。我自己还没有测试过,但我相信它是有效的。

要跟踪规则激活,您可以使用 AgendaEventListener。下面是一个示例,如下所示:

https://github.com/gratiartis/sctrcd- payment-validation-web/blob/master/src/main/java/com/sctrcd/drools/util/TrackingAgendaEventListener.java https://github.com/gratiartis/sctrcd-payment-validation-web/blob/master/src/main/java/com/sctrcd/drools/util/TrackingAgendaEventListener.java

您只需要创建这样的侦听器并将其附加到会话,如下所示:

ksession = kbase.newStatefulKnowledgeSession();
AgendaEventListener agendaEventListener = new TrackingAgendaEventListener();
ksession.addEventListener(agendaEventListener);
//...
ksession.fireAllRules();
//...
List<Activation> activations = agendaEventListener.getActivationList();

请注意,还有WorkingMemoryEventListener,它使您能够执行相同的操作来跟踪事实的插入、更新和撤回。

跟踪和记录 AgendaEventListener 的代码:

package com.sctrcd.drools.util;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.drools.definition.rule.Rule;
import org.drools.event.rule.DefaultAgendaEventListener;
import org.drools.event.rule.AfterActivationFiredEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * A listener that will track all rule firings in a session.
 * 
 * @author Stephen Masters
 */
public class TrackingAgendaEventListener extends DefaultAgendaEventListener {

    private static Logger log = LoggerFactory.getLogger(TrackingAgendaEventListener.class);

    private List<Activation> activationList = new ArrayList<Activation>();

    @Override
    public void afterActivationFired(AfterActivationFiredEvent event) {
        Rule rule = event.getActivation().getRule();

        String ruleName = rule.getName();
        Map<String, Object> ruleMetaDataMap = rule.getMetaData();

        activationList.add(new Activation(ruleName));
        StringBuilder sb = new StringBuilder("Rule fired: " + ruleName);

        if (ruleMetaDataMap.size() > 0) {
            sb.append("\n  With [" + ruleMetaDataMap.size() + "] meta-data:");
            for (String key : ruleMetaDataMap.keySet()) {
                sb.append("\n    key=" + key + ", value="
                        + ruleMetaDataMap.get(key));
            }
        }

        log.debug(sb.toString());
    }

    public boolean isRuleFired(String ruleName) {
        for (Activation a : activationList) {
            if (a.getRuleName().equals(ruleName)) {
                return true;
            }
        }
        return false;
    }

    public void reset() {
        activationList.clear();
    }

    public final List<Activation> getActivationList() {
        return activationList;
    }

    public String activationsToString() {
        if (activationList.size() == 0) {
            return "No activations occurred.";
        } else {
            StringBuilder sb = new StringBuilder("Activations: ");
            for (Activation activation : activationList) {
                sb.append("\n  rule: ").append(activation.getRuleName());
            }
            return sb.toString();
        }
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Drools-如何找出所有规则都匹配了? 的相关文章

随机推荐

  • 如果 HashMap 扩展了 AbstractMap,为什么还要实现 Map? [复制]

    这个问题在这里已经有答案了 可能的重复 Java util HashMap 为什么 HashMap 扩展 AbstractMap 并实现 Map https stackoverflow com questions 2294519 java
  • 带有自定义字体的 UILabel 显示*错误*自定义字体

    我在用着this https stackoverflow com questions 360751 can i embed a custom font in an iphone application 2616101 2616101在我的
  • 如何让JTextPane水平滚动

    我有一个JTextPane 当线路太多时 vertical出现滚动条 但是当一行太长时 不是出现水平滚动条 而是该行断成两行 如何让水平条出现而不是断成两行 我的jTextPane添加如下 JScrollPane jScrollPane1
  • Java 在不应该使用 Kerberos TicketCache 时自动使用它?

    我们有一个可以与外部服务通信的服务器端应用程序 这取决于我们的配置 我们是否使用呼叫我们的用户的凭据 预配置的凭据对这些服务进行身份验证 或者根本不进行身份验证 外部服务可以使用 HTTP Negotiate 身份验证 对于我们的自定义 H
  • 我可以仅使用 Facebook 签名请求安全地验证 Facebook 用户吗?

    我想让我的用户能够将他们的用户帐户与 Facebook 或 Twitter 相关联 并允许他们使用 Facebook Twitter 帐户登录我的服务器 而不是使用经典的用户名 密码 和登录的思路基本一样堆栈溢出 https stackov
  • 如何使用 Swift 从 iOS HealthKit 应用程序读取心率?

    我正在使用以下 Swift 代码 let sampleType HKSampleType HKSampleType quantityTypeForIdentifier HKQuantityTypeIdentifierHeartRate le
  • 如何将 LaTeX 片段直接包含在 Doxygen 注释中?

    我希望能够使用一些合适的编辑器在外部编辑一些 Doxygen 注释的 LaTeX 部分 我只会在复杂的环境中使用它 为此 我想我可以拥有纯 LaTeX 文件并从 Doxygen 中包含它们 我确实为以下内容创建了 Doxygen 别名 be
  • django搜索页面未找到错误

    我陷入了困境 我应该能够在页面上输入搜索查询 并且 django 应该返回匹配页面的列表 如果有 但它没有向我显示任何页面 即使它在那里 并且给了我一个错误 假设我有一页内容为一 当我搜索时 我收到此错误 找不到页面 404 请求方式 GE
  • 如何简单地删除旧的核心数据并重建新的?

    我尝试将 coreData 迁移到新版本 我正在执行以下步骤 添加新的模型版本 选择 name xcdatamodeld 然后选择 Editor gt Add 模型版本 在进行任何更改之前 如果您已经有应用程序 提交到App Store的是
  • 具有空键功能的线程安全映射

    我需要一个多线程 Map 对象在我的 Web 服务器的缓存中使用 并且我需要null keys HashMap允许我有空键 但是ConcurrentHashMap没有 我尝试创建一个同步版本HashMap using Collections
  • 如何使用openpyxl通过DefinedName获取单元格内容?

    例如单元格的坐标为A1 设置aDefinedName name cat with coordinate A1 然后我想读取内容cell via DefinedName cat 但好像不支持 还有其他方法可以帮忙吗 请参阅此处的示例图片 ht
  • 如何调试内置的 Python 命令、包或模块?

    我想调试 Python 安装附带的一些基本包和 或内置包 包括pip and venv 这个愿望来自于文件权限的错误消息 无法访问具有 不可打印文件名 的文件 我的一些团队正在运行这些命令 请参阅这个问题 https stackoverfl
  • Google 表格到日历 - 更新之前的活动脚本

    我在表格中设置了预算 并有一个脚本可以用截止日期更新我的日历 我的脚本是 function onOpen var ui SpreadsheetApp getUi ui createMenu Sync to Calendar addItem
  • CMake-CPack包安装路径噩梦

    我对 CMake CPack 感到沮丧近一周了 不好的是 CMake CPack 在线文档没有很好地记录这部分 经过谷歌搜索后 我找到了可以使用的变量 CPACK PACKAGING PREFIX NOT documented CMAKE
  • 按分钟对索引进行分组并计算平均值

    所以我有一个名为 df 的 pandas 数据框 我想删除秒数并只使用 YYYY MM DD HH MM 格式的索引 然后还会对分钟进行分组并显示该分钟的平均值 所以我想把这个数据框 value 2015 05 03 00 00 00 61
  • 5 分钟内的 Maven 问题

    我正在跟进5 分钟内完成 Maven http maven apache org guides getting started maven in five minutes html手册包含以下内容 mvn archetype generat
  • MapGroupsWithState 的 Spark 结构化流状态存储在哪里?

    我知道状态作为状态存储保存在检查点位置 但我不知道它还在内存中 存储在哪里 我创建了一个使用mapGroupsWithState的Streaming作业 但我看到执行器使用的存储内存为0 这是否意味着状态存储在执行内存中 我无法知道状态消耗
  • 如何在 Swift 中将字典保存到核心数据

    使用 Core Data 保存字典的最佳方法是什么 我有一本字典定义为 var myRecipes String Recipe 其中 Recipe 是一个包含菜谱健康信息的结构 该字符串将是 早餐 或 午餐 等类别 而食谱数组将包含早餐或午
  • 如何检查嵌入资源是否存在?

    在 Delphi 中 我正在构建一个 HTTP 应用程序 或者更确切地说是一个 Web 服务器 它本质上是一个内置于单个 EXE 文件中的整个网站 我嵌入的文件包括 HTML JS CSS SWF PNG XML 等 资源名称与原始文件名相
  • Drools-如何找出所有规则都匹配了?

    我有一个 DRL 文件 其中有 10 条规则 一旦我插入一个事实 一些规则可能会被匹配 我如何找出以编程方式匹配的规则 请注意 此答案对于 Drools 5 x 及以下版本有效 如果您已转到 6 或更高版本 请查看 melchoir55 修