Java 关于drools运行时的信息

Java 关于drools运行时的信息,java,drools,rule-engine,Java,Drools,Rule Engine,我需要在java web app中访问运行drools引擎的运行时信息。 我需要知道的事情: 任何时刻运行时中的活动规则是什么? 到目前为止,会话中插入了多少对象? 是否有一些类允许您在运行时访问drools的信息? 提前感谢您只需检查KnowledgeBase和StatefulKnowledgeSession类。以下方法演示了如何掌握知识库中的所有规则以及工作记忆中的所有事实 /** * Get a String showing all packages and rules in a kno

我需要在java web app中访问运行drools引擎的运行时信息。

我需要知道的事情:

任何时刻运行时中的活动规则是什么?
到目前为止,会话中插入了多少对象?

是否有一些类允许您在运行时访问drools的信息?


提前感谢

您只需检查KnowledgeBase和StatefulKnowledgeSession类。以下方法演示了如何掌握知识库中的所有规则以及工作记忆中的所有事实

/**
 * Get a String showing all packages and rules in a knowledge base.
 */
public String kbString(KnowledgeBase kbase) {
    StringBuilder sb = new StringBuilder();
    for (KnowledgePackage p : kbase.getKnowledgePackages()) {
        sb.append("\n  Package : " + p.getName());
        for (Rule r : p.getRules()) {
            sb.append("\n    Rule: " + r.getName());
        }
    }
    return "Knowledge base built with packages: " + sb.toString();
}

/**
 * Get a String showing the facts currently in working memory, 
 * and their details.
 * 
 * @param session The session to search for facts.
 */
public String sessionFactsString(StatefulKnowledgeSession session) {
    StringBuilder sb = new StringBuilder();
    sb.append("\nThe following facts are currently in the system...");
    for (Object fact : session.getObjects()) {
        sb.append("\n\nFact: " + DroolsUtil.objectDetails(fact));
    }
    return sb.toString();
}
为清晰起见进行编辑-上面的objectDetails(Object)方法是一种使用ApacheCommonsBeanutils将任何旧Java bean呈现为字符串的方法。看起来是这样的:

public static String objectDetails(Object o) {
    StringBuilder sb = new StringBuilder(o.getClass().getSimpleName());

    try {
        @SuppressWarnings("unchecked")
        Map<String, Object> objectProperties = BeanUtils.describe(o);
        for (String k : objectProperties.keySet()) {
            sb.append(", " + k + "=\"" + objectProperties.get(k) + "\"");
        }
    } catch (IllegalAccessException e) {
        return "IllegalAccessException attempting to parse object.";
    } catch (InvocationTargetException e) {
        return "InvocationTargetException attempting to parse object.";
    } catch (NoSuchMethodException e) {
        return "NoSuchMethodException attempting to parse object.";
    }

    return sb.toString();
}
公共静态字符串objectDetails(对象o){
StringBuilder sb=新的StringBuilder(o.getClass().getSimpleName());
试一试{
@抑制警告(“未选中”)
Map objectProperties=BeanUtils.description(o);
for(字符串k:objectProperties.keySet()){
sb.append(“,”+k+“=\”+objectProperties.get(k)+“\”);
}
}捕获(非法访问例外e){
返回“IllegalAccessException正在尝试分析对象。”;
}捕获(调用TargetException e){
返回“InvocationTargetException正在尝试分析对象。”;
}捕获(无此方法例外){
返回“NoSuchMethodException正在尝试分析对象。”;
}
使某人返回字符串();
}

您只需要检查KnowledgeBase和StatefulKnowledgeSession类。以下方法演示了如何掌握知识库中的所有规则以及工作记忆中的所有事实

/**
 * Get a String showing all packages and rules in a knowledge base.
 */
public String kbString(KnowledgeBase kbase) {
    StringBuilder sb = new StringBuilder();
    for (KnowledgePackage p : kbase.getKnowledgePackages()) {
        sb.append("\n  Package : " + p.getName());
        for (Rule r : p.getRules()) {
            sb.append("\n    Rule: " + r.getName());
        }
    }
    return "Knowledge base built with packages: " + sb.toString();
}

/**
 * Get a String showing the facts currently in working memory, 
 * and their details.
 * 
 * @param session The session to search for facts.
 */
public String sessionFactsString(StatefulKnowledgeSession session) {
    StringBuilder sb = new StringBuilder();
    sb.append("\nThe following facts are currently in the system...");
    for (Object fact : session.getObjects()) {
        sb.append("\n\nFact: " + DroolsUtil.objectDetails(fact));
    }
    return sb.toString();
}
为清晰起见进行编辑-上面的objectDetails(Object)方法是一种使用ApacheCommonsBeanutils将任何旧Java bean呈现为字符串的方法。看起来是这样的:

public static String objectDetails(Object o) {
    StringBuilder sb = new StringBuilder(o.getClass().getSimpleName());

    try {
        @SuppressWarnings("unchecked")
        Map<String, Object> objectProperties = BeanUtils.describe(o);
        for (String k : objectProperties.keySet()) {
            sb.append(", " + k + "=\"" + objectProperties.get(k) + "\"");
        }
    } catch (IllegalAccessException e) {
        return "IllegalAccessException attempting to parse object.";
    } catch (InvocationTargetException e) {
        return "InvocationTargetException attempting to parse object.";
    } catch (NoSuchMethodException e) {
        return "NoSuchMethodException attempting to parse object.";
    }

    return sb.toString();
}
公共静态字符串objectDetails(对象o){
StringBuilder sb=新的StringBuilder(o.getClass().getSimpleName());
试一试{
@抑制警告(“未选中”)
Map objectProperties=BeanUtils.description(o);
for(字符串k:objectProperties.keySet()){
sb.append(“,”+k+“=\”+objectProperties.get(k)+“\”);
}
}捕获(非法访问例外e){
返回“IllegalAccessException正在尝试分析对象。”;
}捕获(调用TargetException e){
返回“InvocationTargetException正在尝试分析对象。”;
}捕获(无此方法例外){
返回“NoSuchMethodException正在尝试分析对象。”;
}
使某人返回字符串();
}

出于调试目的,您还可以将这些侦听器添加到知识会话中

Drools有一个事件模型,它公开了许多正在发生的事情 在内部,提供了两个默认调试侦听器 DebuggendaEventListener和DebugWorkingMemoryEventListener 将调试事件信息打印到err控制台,添加侦听器 对会话的访问非常简单,如下所示。工作记忆文件记录器 提供可在图形查看器中查看的执行审核; 它实际上是一个建立在议程和 工作内存侦听器,当引擎完成执行时 必须调用logger.writeToDisk()


出于调试目的,您还可以将这些侦听器添加到知识会话中

Drools有一个事件模型,它公开了许多正在发生的事情 在内部,提供了两个默认调试侦听器 DebuggendaEventListener和DebugWorkingMemoryEventListener 将调试事件信息打印到err控制台,添加侦听器 对会话的访问非常简单,如下所示。工作记忆文件记录器 提供可在图形查看器中查看的执行审核; 它实际上是一个建立在议程和 工作内存侦听器,当引擎完成执行时 必须调用logger.writeToDisk()