Drools - Depuração

Existem diferentes maneiras de depurar um projeto Drools. Aqui, escreveremos uma classe de utilitário para que você saiba quais regras estão sendo acionadas ou acionadas.

Com essa abordagem, você pode verificar quais regras estão sendo acionadas em seu projeto Drools. Aqui está nossa aula de utilidades

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

O primeiro método help imprime a regra disparada junto com algumas informações extras que você pode passar como String por meio do arquivo DRL.

A segunda regra helper imprime se a regra específica foi acionada ou não.

Adicionamos um dos métodos de utilitário em cada arquivo DRL. Também adicionamos a função de importação no arquivo DRL (Pune.drl). Nothenparte da regra, adicionamos a chamada de função de utilidade. O Pune.drl modificado é fornecido abaixo. As alterações são destacadas em 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

Da mesma forma, adicionamos a outra função de utilitário no segundo arquivo DRL (Nagpur.drl). Aqui está o 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

Execute o programa novamente e ele deve produzir a seguinte saída -

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

Ambas as funções de utilitário são chamadas e mostra se a regra específica foi chamada ou não. No exemplo acima, todas as regras estão sendo chamadas, mas em um aplicativo corporativo, essa função de utilitário pode ser muito útil para depurar e descobrir se uma determinada regra foi disparada ou não.

Usando a perspectiva de depuração no Eclipse

Você pode depurar as regras durante a execução de seu aplicativo Drools. Você pode adicionar pontos de interrupção nas consequências de suas regras e, sempre que tal ponto de interrupção for encontrado durante a execução das regras, a execução será interrompida temporariamente. Você pode então inspecionar as variáveis ​​conhecidas naquele ponto como faz em um aplicativo Java e usar as opções normais de depuração disponíveis no Eclipse.

Para criar um ponto de interrupção em seu arquivo DRL, basta clicar duas vezes na linha onde deseja criar um ponto de interrupção. Lembre-se, você só pode criar um ponto de interrupção nothenparte de uma regra. Um ponto de interrupção pode ser removido clicando duas vezes no ponto de interrupção no editor DRL.

Depois de aplicar os pontos de interrupção, você precisa depurar seu aplicativo como um aplicativo Drools. Os pontos de interrupção do Drools (pontos de interrupção no arquivo DRL) só funcionarão se o seu aplicativo estiver sendo depurado como um aplicativo Drools. Aqui está como você precisa fazer o mesmo -

Depois de depurar seu aplicativo como um aplicativo Drools, você veria o controle no arquivo DRL conforme mostrado na imagem a seguir -

Você pode ver as variáveis ​​e os valores atuais do objeto naquele ponto de depuração. O mesmo controle de F6 para mover para a próxima linha e F8 para pular para o próximo ponto de depuração são aplicáveis ​​aqui também. Desta forma, você pode depurar seu aplicativo Drools.

Note - A perspectiva de depuração no aplicativo Drools funciona apenas se o dialeto for MVEL até o Drools 5.x.