Sbava - Debug

Esistono diversi modi per eseguire il debug di un progetto Drools. Qui, scriveremo una classe Utility per farti sapere quali regole vengono attivate o attivate.

Con questo approccio, puoi verificare quali sono tutte le regole che vengono attivate nel tuo progetto Drools. Ecco la nostra classe di utilità

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

Il primo metodo help stampa la regola attivata insieme ad alcune informazioni extra che puoi passare come stringa tramite il file DRL.

La seconda regola helper stampa se la regola particolare è stata attivata o meno.

Abbiamo aggiunto uno dei metodi di utilità in ogni file DRL. Abbiamo anche aggiunto la funzione di importazione nel file DRL (Pune.drl). Nelthenparte della regola, abbiamo aggiunto la chiamata alla funzione di utilità. Di seguito viene fornito il Pune.drl modificato. Le modifiche sono evidenziate in blu.

Modificato 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

Allo stesso modo, abbiamo aggiunto l'altra funzione di utilità nel secondo file DRL (Nagpur.drl). Ecco il codice modificato -

Nagpur.drl modificato

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

Esegui di nuovo il programma e dovrebbe produrre il seguente output:

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

Vengono chiamate entrambe le funzioni di utilità e mostra se la regola particolare è stata chiamata o meno. Nell'esempio precedente, tutte le regole vengono chiamate, ma in un'applicazione aziendale questa funzione di utilità può essere davvero utile per eseguire il debug e scoprire se una determinata regola è stata attivata o meno.

Utilizzo della prospettiva di debug in Eclipse

Puoi eseguire il debug delle regole durante l'esecuzione dell'applicazione Drools. È possibile aggiungere punti di interruzione nelle conseguenze delle regole e ogni volta che si incontra un tale punto di interruzione durante l'esecuzione delle regole, l'esecuzione viene temporaneamente interrotta. È quindi possibile ispezionare le variabili note a quel punto come si fa in un'applicazione Java e utilizzare le normali opzioni di debug disponibili in Eclipse.

Per creare un punto di interruzione nel file DRL, fai doppio clic sulla riga in cui desideri creare un punto di interruzione. Ricorda, puoi creare solo un punto di interruzione nel filethenparte di una regola. Un punto di interruzione può essere rimosso facendo doppio clic sul punto di interruzione nell'editor DRL.

Dopo aver applicato i punti di interruzione, è necessario eseguire il debug dell'applicazione come applicazione Drools. I punti di interruzione Drools (punti di interruzione nel file DRL) funzioneranno solo se la tua applicazione è in fase di debug come applicazione Drools. Ecco come devi fare lo stesso:

Dopo aver eseguito il debug dell'applicazione come applicazione Drools, vedrai il controllo sul file DRL come mostrato nella seguente schermata:

Puoi vedere le variabili ei valori correnti dell'oggetto in quel punto di debug. Lo stesso controllo di F6 per passare alla riga successiva e F8 per passare al punto di debug successivo sono applicabili anche qui. In questo modo, puoi eseguire il debug della tua applicazione Drools.

Note - La prospettiva di debug nell'applicazione Drools funziona solo se il dialetto è MVEL fino a Drools 5.x.