- Drools 教程
- Drools - 首页
- Drools - 简介
- Drools - Eclipse 插件
- Drools - 运行时
- Drools - 创建 Drools 程序
- Drools - 常用术语
- Drools - 规则编写
- Drools - 规则语法
- Drools - Drools 程序示例
- Drools - 调试
- Drools 有用资源
- Drools - 快速指南
- Drools - 有用资源
- Drools - 讨论
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("\nrule triggered: " + drools.getRule().getName()); } public static void helper(final KnowledgeHelper drools){ System.out.println("\nrule triggered: " + drools.getRule().getName()); } }
第一个方法help打印触发的规则以及您可以通过 DRL 文件作为字符串传递的一些额外信息。
第二个规则helper打印特定规则是否被触发。
我们在每个 DRL 文件中添加了一个实用程序方法。我们还在 DRL 文件(Pune.drl)中添加了导入函数。在规则的then部分,我们添加了实用程序函数调用。修改后的 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 中使用调试透视图
您可以在 Drools 应用程序执行期间调试规则。您可以在规则的结果部分添加断点,并在规则执行期间遇到断点时,执行将暂时停止。然后,您可以像在 Java 应用程序中一样检查此时已知的变量,并使用 Eclipse 中提供的正常调试选项。
要在 DRL 文件中创建断点,只需双击要在其中创建断点的行即可。请记住,您只能在规则的then部分创建断点。可以通过双击 DRL 编辑器中的断点来删除断点。
应用断点后,您需要将应用程序作为 Drools 应用程序进行调试。Drools 断点(DRL 文件中的断点)仅在将应用程序作为 Drools 应用程序调试时才有效。以下是执行此操作的方法 -
将应用程序作为 Drools 应用程序调试后,您将在 DRL 文件上看到如下所示的控制 -
您可以看到变量以及该调试点处对象的当前值。此处也适用 F6 移动到下一行和 F8 跳到下一个调试点的相同控制。通过这种方式,您可以调试 Drools 应用程序。
注意 - Drools 应用程序中的调试透视图仅在方言为 MVEL(直到 Drools 5.x)时才有效。