有不同的方法來偵錯Drools專案。在這裡,我們將編寫一個實用工具類,知道哪些規則正在被觸發或發射。
通過這種方法,可以檢查所有的規則都在Drools專案得到觸發。這裡是我們的工具類
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。改變以藍色顯示。
//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)其他效用函式。這裡是修改後的程式碼:
// 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
這兩個工具函式被呼叫,它顯示了特定規則是否被呼叫與否。在上述的例子中,所有的規則都被呼叫,但在企業應用程式中,該實用程式函式可以是真正有用的偵錯,並找出一個特定規則是否被觸發或沒有。
可以將Drools的應用程式的執行過程中偵錯規則。可以在規則的後果新增斷點,每當這樣的斷點的規則的執行過程中遇到,執行暫時停止。然後,可以檢查該點呼叫Java應用程式,並使用在Eclipse提供正常的偵錯選項。
建立DRL檔案斷點,只需雙擊建立一個斷點行。記住,只能在當時的部分規則的建立一個斷點。斷點可以通過雙擊在DRL編輯器中的斷點被刪除。
採用斷點後,需要將應用程式作為Drools的應用程式進行偵錯。 Drools的斷點(以DRL檔案的斷點),如果應用程式正在偵錯的Drools的應用程式將只工作。這裡是如何需要做的是相同的:
偵錯應用程式作為Drools的應用程式,會看到如圖所示的下面的截圖DRL檔案中的控制:
可以在該偵錯點看到的變數和所述物件的當前值。同一控制F6移動到下一行和F8跳轉到下一個偵錯點也適用在這裡。通過這種方式,可以偵錯Drools的應用程式。
註:在Drools中的應用偵錯的角度來看只有當方言是MVEL直到Drools5.x