Drools-debugging

提供:Dev Guides
移動先:案内検索

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 Application

Droolsアプリケーションとしてアプリケーションをデバッグすると、次のスクリーンショットに示すように、DRLファイルのコントロールが表示されます-

Eclipse Platform

そのデバッグポイントで、オブジェクトの変数と現在の値を確認できます。 次の行に移動するF6と次のデバッグポイントにジャンプするF8の同じ制御もここで適用できます。 このようにして、Droolsアプリケーションをデバッグできます。

-Droolsアプリケーションのデバッグパースペクティブは、Drools 5.xまでダイアレクトがMVELの場合にのみ機能します。