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ファイルを介して文字列として渡すことができるいくつかの追加情報とともに出力します。

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アプリケーションをデバッグできます。

Note − Droolsアプリケーションのデバッグパースペクティブは、Drools5.xまで方言がMVELの場合にのみ機能します。