Drools - Depuración

Hay diferentes formas de depurar un proyecto Drools. Aquí, escribiremos una clase de utilidad para hacerle saber qué reglas se están activando o disparando.

Con este enfoque, puede verificar qué reglas se activan en su proyecto Drools. Aquí está nuestra clase de utilidad

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

El primer método help imprime la regla activada junto con información adicional que puede pasar como Cadena a través del archivo DRL.

La segunda regla helper imprime si la regla en particular se activó o no.

Hemos agregado uno de los métodos de utilidad en cada archivo DRL. También hemos agregado la función de importación en el archivo DRL (Pune.drl). En elthenparte de la regla, hemos agregado la llamada a la función de utilidad. El Pune.drl modificado se muestra a continuación. Los cambios están resaltados en azul.

Pune.drl modificado

//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

De manera similar, hemos agregado la otra función de utilidad en el segundo archivo DRL (Nagpur.drl). Aquí está el código modificado:

Nagpur.drl modificado

// 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

Ejecute el programa nuevamente y debería producir el siguiente resultado:

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

Se llaman a ambas funciones de utilidad y muestra si la regla en particular se llamó o no. En el ejemplo anterior, se están llamando todas las reglas, pero en una aplicación empresarial, esta función de utilidad puede ser realmente útil para depurar y averiguar si una regla en particular se activó o no.

Usando la perspectiva de depuración en Eclipse

Puede depurar las reglas durante la ejecución de su aplicación Drools. Puede agregar puntos de interrupción en las consecuencias de sus reglas, y siempre que se encuentre un punto de interrupción durante la ejecución de las reglas, la ejecución se detiene temporalmente. Luego, puede inspeccionar las variables conocidas en ese punto como lo hace en una aplicación Java y usar las opciones de depuración normales disponibles en Eclipse.

Para crear un punto de interrupción en su archivo DRL, simplemente haga doble clic en la línea donde desea crear un punto de interrupción. Recuerde, solo puede crear un punto de interrupción en elthenparte de una regla. Se puede eliminar un punto de interrupción haciendo doble clic en el punto de interrupción en el editor de DRL.

Después de aplicar los puntos de interrupción, debe depurar su aplicación como una aplicación Drools. Los puntos de interrupción de Drools (puntos de interrupción en el archivo DRL) solo funcionarán si su aplicación se está depurando como una aplicación de Drools. Así es como debe hacer lo mismo:

Una vez que depure su aplicación como una aplicación Drools, verá el control en el archivo DRL como se muestra en la siguiente captura de pantalla:

Puede ver las variables y los valores actuales del objeto en ese punto de depuración. El mismo control de F6 para pasar a la siguiente línea y F8 para saltar al siguiente punto de depuración son aplicables aquí también. De esta manera, puede depurar su aplicación Drools.

Note - La perspectiva de depuración en la aplicación Drools solo funciona si el dialecto es MVEL hasta Drools 5.x.