Drools - Débogage

Il existe différentes manières de déboguer un projet Drools. Ici, nous allons écrire une classe Utility pour vous faire savoir quelles règles sont déclenchées ou déclenchées.

Avec cette approche, vous pouvez vérifier ce que toutes les règles sont déclenchées dans votre projet Drools. Voici notre classe utilitaire

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

La première méthode help imprime la règle déclenchée avec des informations supplémentaires que vous pouvez transmettre en tant que chaîne via le fichier DRL.

La deuxième règle helper imprime si la règle particulière a été déclenchée ou non.

Nous avons ajouté l'une des méthodes utilitaires dans chaque fichier DRL. Nous avons également ajouté la fonction d'importation dans le fichier DRL (Pune.drl). dans lethenpartie de la règle, nous avons ajouté l'appel de fonction utilitaire. Le Pune.drl modifié est donné ci-dessous. Les modifications sont surlignées en bleu.

Modifié 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

De même, nous avons ajouté l'autre fonction utilitaire dans le deuxième fichier DRL (Nagpur.drl). Voici le code modifié -

Nagpur.drl modifié

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

Exécutez à nouveau le programme et il devrait produire la sortie suivante -

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

Les deux fonctions utilitaires sont appelées et il montre si la règle particulière a été appelée ou non. Dans l'exemple ci-dessus, toutes les règles sont appelées, mais dans une application d'entreprise, cette fonction utilitaire peut être vraiment utile pour déboguer et savoir si une règle particulière a été déclenchée ou non.

Utilisation de la perspective de débogage dans Eclipse

Vous pouvez déboguer les règles lors de l'exécution de votre application Drools. Vous pouvez ajouter des points d'arrêt dans les conséquences de vos règles, et chaque fois qu'un tel point d'arrêt est rencontré pendant l'exécution des règles, l'exécution est temporairement arrêtée. Vous pouvez ensuite inspecter les variables connues à ce stade comme vous le faites dans une application Java et utiliser les options de débogage normales disponibles dans Eclipse.

Pour créer un point d'arrêt dans votre fichier DRL, double-cliquez simplement sur la ligne où vous souhaitez créer un point d'arrêt. N'oubliez pas que vous ne pouvez créer un point d'arrêt que dans lethenpartie d'une règle. Un point d'arrêt peut être supprimé en double-cliquant sur le point d'arrêt dans l'éditeur DRL.

Après avoir appliqué les points d'arrêt, vous devez déboguer votre application en tant qu'application Drools. Les points d'arrêt Drools (points d'arrêt dans le fichier DRL) ne fonctionneront que si votre application est déboguée en tant qu'application Drools. Voici comment vous devez faire de même -

Une fois que vous avez débogué votre application en tant qu'application Drools, vous verrez le contrôle sur le fichier DRL comme indiqué dans la capture d'écran suivante -

Vous pouvez voir les variables et les valeurs actuelles de l'objet à ce point de débogage. Le même contrôle de F6 pour passer à la ligne suivante et F8 pour sauter au point de débogage suivant sont également applicables ici. De cette façon, vous pouvez déboguer votre application Drools.

Note - La perspective de débogage dans l'application Drools ne fonctionne que si le dialecte est MVEL jusqu'à Drools 5.x.