Drools偵錯


有不同的方法來偵錯Drools專案。在這裡,我們將編寫一個實用工具類,知道哪些規則正在被觸發或發射。

通過這種方法,可以檢查所有的規則都在Drools專案得到觸發。這裡是我們的工具類

Utility.java

package com.sample;

import org.drools.spi.KnowledgeHelper;

public class Utility {
   public static void help(final KnowledgeHelper drools, final String message){
      System.out.println(message);
      System.out.println("\nrule triggered: " + drools.getRule().getName());
   }
   
   public static void helper(final KnowledgeHelper drools){
      System.out.println("\nrule triggered: " + drools.getRule().getName());
   }
}

第一種方法幫助列印規則一起,可以通過為String通過DRL檔案中的一些額外的資訊觸發。

第二條規則助手列印特定的規則是否被觸發。

我們增加了在每個DRL檔案中的實用方法之一。我們在DRL檔案(Pune.drl)還增加了匯入函式。在當時的部分規則,我們已經加入了效用函式呼叫。下面修改Pune.drl。改變以藍色顯示。

Modified Pune.drl

//created on: Dec 24, 2014
package droolsexample

//list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal;
import com.sample.HelloCity; 

import function com.sample.Utility.helper;

// declare any global variables here
dialect "java"
rule "Pune Medicine Item"

   when
      item : ItemCity(purchaseCity == ItemCity.City.PUNE, 
                      typeofItem == ItemCity.Type.MEDICINES)
   
   then
      BigDecimal tax = new BigDecimal(0.0);
      item.setLocalTax(tax.multiply(item.getSellPrice()));
      HelloCity.writeHello(item.getPurchaseCity().toString()); 
      helper(drools);
end

rule "Pune Groceries Item"

   when
      item : ItemCity(purchaseCity == ItemCity.City.PUNE, 
                      typeofItem == ItemCity.Type.GROCERIES)
      
   then
      BigDecimal tax = new BigDecimal(2.0);
      item.setLocalTax(tax.multiply(item.getSellPrice())); 
      helper(drools);
end

同樣地,我們已經新增在第二個DRL檔案(Nagpur.drl)其他效用函式。這裡是修改後的程式碼:

修改後的 Nagpur.drl

// created on: Dec 26, 2014
package droolsexample

// list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal; 

import function com.sample.Utility.help;

//declare any global variables here
dialect "java"

rule "Nagpur Medicine Item"
   
   when
      item : ItemCity(purchaseCity == ItemCity.City.NAGPUR, 
                      typeofItem == ItemCity.Type.MEDICINES)
   
   then
      BigDecimal tax = new BigDecimal(0.0);
      item.setLocalTax(tax.multiply(item.getSellPrice())); 
      help(drools,"added info");
end

rule "Nagpur Groceries Item"
   
   when
      item : ItemCity(purchaseCity == ItemCity.City.NAGPUR, 
                      typeofItem == ItemCity.Type.GROCERIES)
   
   then
      BigDecimal tax = new BigDecimal(1.0);
      item.setLocalTax(tax.multiply(item.getSellPrice())); 
      help(drools,"info");
end

再次執行程式,它應該產生以下的輸出:

info

rule triggered: Nagpur Groceries Item
added info

rule triggered: Nagpur Medicine Item

rule triggered: Pune Groceries Item
HELLO PUNE!!!!!!

rule triggered: Pune Medicine Item
PUNE 0
PUNE 20
NAGPUR 0
NAGPUR 10

這兩個工具函式被呼叫,它顯示了特定規則是否被呼叫與否。在上述的例子中,所有的規則都被呼叫,但在企業應用程式中,該實用程式函式可以是真正有用的偵錯,並找出一個特定規則是否被觸發或沒有。

使用Debug透檢視在Eclipse

可以將Drools的應用程式的執行過程中偵錯規則。可以在規則的後果新增斷點,每當這樣的斷點的規則的執行過程中遇到,執行暫時停止。然後,可以檢查該點呼叫Java應用程式,並使用在Eclipse提供正常的偵錯選項。

建立DRL檔案斷點,只需雙擊建立一個斷點行。記住,只能在當時的部分規則的建立一個斷點。斷點可以通過雙擊在DRL編輯器中的斷點被刪除。

採用斷點後,需要將應用程式作為Drools的應用程式進行偵錯。 Drools的斷點(以DRL檔案的斷點),如果應用程式正在偵錯的Drools的應用程式將只工作。這裡是如何需要做的是相同的:

Drools Application

偵錯應用程式作為Drools的應用程式,會看到如圖所示的下面的截圖DRL檔案中的控制:

Eclipse Platform

可以在該偵錯點看到的變數和所述物件的當前值。同一控制F6移動到下一行和F8跳轉到下一個偵錯點也適用在這裡。通過這種方式,可以偵錯Drools的應用程式。

註:在Drools中的應用偵錯的角度來看只有當方言是MVEL直到Drools5.x