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());
}
}
วิธีแรก help พิมพ์กฎที่เรียกพร้อมกับข้อมูลเพิ่มเติมบางอย่างซึ่งคุณสามารถส่งผ่านเป็น String ผ่านไฟล์ DRL
กฎข้อที่สอง helper พิมพ์ว่ากฎเฉพาะถูกทริกเกอร์หรือไม่
เราได้เพิ่มหนึ่งในวิธียูทิลิตี้ในไฟล์ DRL แต่ละไฟล์ นอกจากนี้เรายังได้เพิ่มฟังก์ชันการนำเข้าในไฟล์ DRL (Pune.drl) ในthenส่วนหนึ่งของกฎเราได้เพิ่มการเรียกฟังก์ชันยูทิลิตี้ 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) นี่คือรหัสที่แก้ไข -
แก้ไข 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 Perspective ใน Eclipse
คุณสามารถดีบักกฎระหว่างการเรียกใช้แอปพลิเคชัน Drools ของคุณ คุณสามารถเพิ่มเบรกพอยต์ในผลที่ตามมาของกฎของคุณและเมื่อใดก็ตามที่พบเบรกพอยต์ดังกล่าวในระหว่างการดำเนินการตามกฎการดำเนินการจะหยุดลงชั่วคราว จากนั้นคุณสามารถตรวจสอบตัวแปรที่รู้จัก ณ จุดนั้นเช่นเดียวกับที่คุณทำใน Java Application และใช้อ็อพชันการดีบักปกติที่มีอยู่ใน Eclipse
ในการสร้างเบรกพอยต์ในไฟล์ DRL ของคุณเพียงดับเบิลคลิกที่บรรทัดที่คุณต้องการสร้างเบรกพอยต์ โปรดจำไว้ว่าคุณสามารถสร้างเบรกพอยต์ในไฟล์thenเป็นส่วนหนึ่งของกฎ สามารถลบเบรกพอยต์ได้โดยดับเบิลคลิกที่เบรกพอยต์ในตัวแก้ไข DRL
หลังจากใช้เบรกพอยต์แล้วคุณต้องดีบักแอปพลิเคชันของคุณเป็นแอปพลิเคชัน Drools Drools เบรกพอยต์ (เบรกพอยต์ในไฟล์ DRL) จะใช้งานได้ก็ต่อเมื่อแอปพลิเคชันของคุณถูกดีบักเป็นแอปพลิเคชัน Drools นี่คือวิธีที่คุณต้องทำเช่นเดียวกัน -
เมื่อคุณดีบักแอปพลิเคชันของคุณเป็นแอปพลิเคชัน Drools คุณจะเห็นการควบคุมไฟล์ DRL ดังที่แสดงในภาพหน้าจอต่อไปนี้ -
คุณสามารถดูตัวแปรและค่าปัจจุบันของออบเจ็กต์ได้ที่จุดดีบักนั้น การควบคุมเดียวกันของ F6 เพื่อย้ายไปยังบรรทัดถัดไปและ F8 เพื่อข้ามไปยังจุดดีบักถัดไปก็ใช้ได้เช่นกัน ด้วยวิธีนี้คุณสามารถดีบักแอปพลิเคชัน Drools ของคุณ
Note - มุมมองการดีบักในแอปพลิเคชัน Drools จะทำงานได้ก็ต่อเมื่อภาษาถิ่นเป็น MVEL จนถึง Drools 5.x