Drools - 调试

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

通过这种方法,您可以检查 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("
rule triggered: " + drools.getRule().getName());
   }
   public static void helper(final KnowledgeHelper drools){
      System.out.println("
rule triggered: " + drools.getRule().getName());
   }
}

第一个方法 help 打印触发的规则以及一些额外信息,您可以通过 DRL 文件将这些信息作为字符串传递。

第二个规则 helper 打印特定规则是否被触发。

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

Modified 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) 中添加了另一个实用函数。以下是修改后的代码 −

Modified 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 中的调试透视图

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

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

应用断点后,您需要将应用程序作为 Drools 应用程序进行调试。只有当您的应用程序作为 Drools 应用程序进行调试时,Drools 断点(DRL 文件中的断点)才会起作用。以下是您需要执行相同操作的方法 −

Drools Application

一旦您将应用程序作为 Drools 应用程序进行调试,您将在 DRL 文件上看到控件,如以下屏幕截图所示 −

Eclipse Platform

您可以在该调试点看到对象的变量和当前值。相同的控制 F6 移动到下一行,F8 跳转到下一个调试点也适用于此。这样,您就可以调试 Drools 应用程序了。

注意 − Drools 应用程序中的调试视角仅在方言为 MVEL 时才有效,直到 Drools 5.x。