2014-01-06 70 views
1

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

我需要知道的事情:有关drools运行时信息

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

有没有一些类可以让你访问drools运行时的信息?

在此先感谢

回答

4

你只需要检查的知识库和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(对象)上述方法是用于呈现任何旧的Java bean为字符串,使用Apache共享BeanUtils的方法。它看起来像这样:

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(); 
} 
1

为了调试,你还可以将这些监听器添加到KnowledgeSession

的Drools有一个事件模型,暴露了太多发生了什么 内部,两个默认调试监听器提供 DebugAgendaEventListener和DebugWorkingMemoryEventListener,其中 将调试事件信息打印到err控制台,将侦听器 添加到会话中很简单,如下所示。 WorkingMemoryFileLogger 提供执行审计,可以在图形查看器中查看; 它实际上是一个建立在议程上的专门的实现,当引擎执行完成时,工作内存监听器为 ,必须调用logger.writeToDisk()。

ksession.addEventListener(new DebugAgendaEventListener()); // add 2 debug event listeners 
    ksession.addEventListener(new DebugWorkingMemoryEventListener());  
// setup the audit logging 

    WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger(session); 
    logger.setFileName("log/helloworld");