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