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.