📜  Drools-调试

📅  最后修改于: 2020-10-15 10:59:23             🧑  作者: Mango


有多种调试Drools项目的方法。在这里,我们将编写一个Utility类,以让您知道正在触发或触发哪些规则。

使用这种方法,您可以检查在Drools项目中触发了哪些所有规则。这是我们的实用程序类

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

第一种方法有助于打印触发的规则以及一些其他信息,您可以通过DRL文件将这些信息作为String传递。

第二个规则帮助程序将打印是否触发了特定规则。

我们在每个DRL文件中添加了一种Utility方法。我们还在DRL文件(Pune.drl)中添加了导入函数。在规则的随后部分,我们添加了实用程序函数调用。修改后的Pune.drl如下。更改以蓝色突出显示。

修改后的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

同样,我们在第二个DRL文件(Nagpur.drl)中添加了另一个实用程序函数。这是修改后的代码-

修改的Nagpur.drl

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

再次运行程序,它将产生以下输出-

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

这两个实用程序函数都被调用,并且它显示是否调用了特定规则。在上面的示例中,所有规则都被调用,但是在企业应用程序中,此实用程序函数对于调试和查找是否触发了特定规则非常有用。

在Eclipse中使用Debug透视图

您可以在执行Drools应用程序期间调试规则。您可以在规则的后果中添加断点,并且在规则执行期间每遇到这样的断点,都会暂时停止执行。然后,您可以像在Java应用程序中一样检查当时已知的变量,并使用Eclipse中可用的常规调试选项。

要在DRL文件中创建断点,只需在要创建断点的行上双击即可。请记住,您只能在规则的随后部分创建一个断点。可以通过在DRL编辑器中双击断点来删除断点。

应用断点后,您需要将应用程序调试为Drools应用程序。 Drools断点(DRL文件中的断点)仅在将您的应用程序调试为Drools应用程序时起作用。这是您需要执行的操作-

流口水应用

将您的应用程序调试为Drools应用程序后,您将看到DRL文件上的控件,如以下屏幕截图所示-

Eclipse平台

您可以在该调试点查看对象的变量和当前值。同样适用于F6移至下一行和F8跳至下一个调试点的控件。这样,您可以调试Drools应用程序。

– Drools应用程序中的调试透视图仅在方言为MVEL时才有效,直到Drools5.x。