Drools - Hata Ayıklama

Bir Drools projesinde hata ayıklamanın farklı yolları vardır. Burada, hangi kuralların tetiklendiğini veya tetiklendiğini size bildirmek için bir Utility sınıfı yazacağız.

Bu yaklaşımla, Drools projenizde hangi kuralların tetiklendiğini kontrol edebilirsiniz. İşte Yardımcı Sınıfımız

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());
   }
}

İlk yöntem help DRL dosyası aracılığıyla Dize olarak iletebileceğiniz bazı ekstra bilgilerle birlikte tetiklenen kuralı yazdırır.

İkinci kural helper belirli kuralın tetiklenip tetiklenmediğini yazdırır.

Her DRL dosyasına Yardımcı Yöntem yöntemlerinden birini ekledik. DRL dosyasına (Pune.drl) içe aktarma işlevini de ekledik. İçindethenkuralın bir parçası olarak, fayda fonksiyonu çağrısını ekledik. Değiştirilmiş Pune.drl aşağıda verilmiştir. Değişiklikler mavi renkle vurgulanmıştır.

Değiştirilmiş 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

Benzer şekilde, diğer yardımcı program işlevini ikinci DRL dosyasına (Nagpur.drl) ekledik. İşte değiştirilen kod -

Değiştirilmiş 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

Programı tekrar çalıştırın ve aşağıdaki çıktıyı üretmelidir -

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

Her iki yardımcı program işlevi de çağrılır ve belirli kuralın çağrılıp çağrılmadığını gösterir. Yukarıdaki örnekte, tüm kurallar çağrılmaktadır, ancak bir kurumsal uygulamada, bu yardımcı program işlevi, belirli bir kuralın çalıştırılıp çalıştırılmadığını hata ayıklamak ve bulmak için gerçekten yararlı olabilir.

Eclipse'de Hata Ayıklama Perspektifini Kullanma

Drools uygulamanızın yürütülmesi sırasında kurallarda hata ayıklayabilirsiniz. Kurallarınızın sonuçlarına kesme noktaları ekleyebilirsiniz ve kuralların yürütülmesi sırasında böyle bir kesme noktasıyla karşılaşıldığında, yürütme geçici olarak durdurulur. Daha sonra o noktada bilinen değişkenleri bir Java Uygulamasında yaptığınız gibi inceleyebilir ve Eclipse'de bulunan normal hata ayıklama seçeneklerini kullanabilirsiniz.

DRL dosyanızda bir kesme noktası oluşturmak için, bir kesme noktası oluşturmak istediğiniz satırı çift tıklamanız yeterlidir. Unutmayın, yalnızca şurada bir kesme noktası oluşturabilirsiniz:thenbir kuralın parçası. DRL düzenleyicisinde kesme noktasına çift tıklayarak bir kesme noktası kaldırılabilir.

Kesme noktalarını uyguladıktan sonra, uygulamanızda bir Drools uygulaması olarak hata ayıklamanız gerekir. Drools kesme noktaları (DRL dosyasındaki kesme noktaları) yalnızca uygulamanızın bir Drools uygulaması olarak hata ayıklaması yapılıyorsa çalışır. İşte aynısını nasıl yapmanız gerektiği -

Uygulamanızda bir Drools uygulaması olarak hata ayıkladıktan sonra, aşağıdaki ekran görüntüsünde gösterildiği gibi DRL dosyasındaki kontrolü görürsünüz -

Bu hata ayıklama noktasında nesnenin değişkenlerini ve mevcut değerlerini görebilirsiniz. Bir sonraki satıra geçmek için F6'nın ve bir sonraki hata ayıklama noktasına atlamak için F8'in aynı kontrolü burada da uygulanabilir. Bu şekilde, Drools uygulamanızda hata ayıklayabilirsiniz.

Note - Drools uygulamasındaki hata ayıklama perspektifi, yalnızca lehçe MVEL ise Drools 5.x'e kadar çalışır.