Drools-debugging
Drools-デバッグ
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());
}
}
最初のメソッド help は、DRLファイルを介してStringとして渡すことができるいくつかの追加情報とともに、トリガーされたルールを出力します。
2番目のルール helper は、特定のルールがトリガーされたかどうかを出力します。
各DRLファイルにユーティリティメソッドの1つを追加しました。 また、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
同様に、2番目の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アプリケーションのデバッグパースペクティブは、Drools 5.xまでダイアレクトがMVELの場合にのみ機能します。