2014-01-06 69 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");