Drools-クイックガイド

Javaエンタープライズレベルのアプリケーションは、3つの部分に分けることができます-

  • UI-ユーザーインターフェイス(フロントエンド)
  • データベースに接続されているサービスレイヤー
  • ビジネス層

SpringやStrutsなど、UIとサービスレイヤーを一緒に処理するフレームワークがいくつかあります。それでも、Droolsが登場するまで、ビジネスロジックを処理する標準的な方法はありませんでした。

Droolsとは何ですか?

Droolsは Business Logic integration Platform (BLiP)。Javaで書かれています。これは、JBossとRed Hat、Incが支援するオープンソースプロジェクトです。Reteパターンマッチングアルゴリズムを拡張および実装します。

素人の言葉で言えば、Droolsは、ビジネスプロセス内にあるロジックとデータを分離して推論できるようにするツールのコレクションです。注意する必要がある2つの重要なキーワードはLogic そして Data

Droolsは2つの主要な部分に分かれています。 Authoring そして Runtime

  • Authoring −オーサリングプロセスには、ルールファイル(.DRLファイル)の作成が含まれます。

  • Runtime −作業メモリーの作成とアクティベーションの処理が含まれます。

ルールエンジンとは何ですか?

Droolsは、ルールベースのアプローチを使用してエキスパートシステムを実装するルールエンジンまたはプロダクションルールシステムです。エキスパートシステムは、知識表現を使用して、取得した知識を推論に使用できる知識ベースに処理する知識ベースのシステムです。

プロダクションルールシステムは、命題論理と一階述語論理を簡潔で曖昧さのない宣言的な方法で表現するための知識表現に焦点を当てたチューリング完全です。

プロダクションルールシステムの頭脳は Inference Engineこれは、多数のルールや事実に拡張できます。推論エンジンは、事実とデータをプロダクションルールと照合します-別名Productions あるいは単に Rules –行動につながる結論を推測する。

プロダクションルールは、知識表現を推論するために一階述語論理を使用する2つの部分からなる構造です。ビジネスルールエンジンは、ランタイム実稼働環境で1つ以上のビジネスルールを実行するソフトウェアシステムです。

ルールエンジンを使用すると、「What to Do」ではなく「How to do it。」

ルールとは何ですか?

ルールは、知識の断片は、多くの場合、のように表現されている「場合には、いくつかの条件が発生し、その後、いくつかのタスクを実行します。」

When
   <Condition is true>
Then
   <Take desired Action>

ルールの最も重要な部分は when部。の場合when 一部が満たされている、 then パーツがトリガーされます。

rule  <rule_name>
   <attribute> <value>
      
   when
      <conditions>
      
   then
      <actions>
end

パターンマッチング

新規または既存のファクトをプロダクションルールと照合するプロセスは、パターンマッチングと呼ばれ、推論エンジンによって実行されます。パターンマッチングに使用されるアルゴリズムには、次のようなものがあります。

  • Linear
  • Rete
  • Treat
  • Leaps

Droolsは、Reteアルゴリズムを実装および拡張します。Drools Reteの実装はReteOOと呼ばれ、Droolsがオブジェクト指向システム用のReteアルゴリズムの拡張および最適化された実装を持っていることを意味します。

ルールエンジンの利点

宣言型プログラミング

ルールを使用すると、難しい問題の解決策を簡単に表現し、解決策を検証することもできます。コードとは異なり、ルールはそれほど複雑でない言語で書かれています。ビジネスアナリストは、一連のルールを簡単に読み取って検証できます。

ロジックとデータの分離

データはドメインオブジェクトに存在し、ビジネスロジックはルールに存在します。プロジェクトの種類によっては、この種類の分離が非常に有利な場合があります。

速度とスケーラビリティ

Droolsが記述されているReteOOアルゴリズムは、すでに実証済みのアルゴリズムです。Droolsの助けを借りて、アプリケーションは非常にスケーラブルになります。頻繁に変更要求がある場合は、既存のルールを変更せずに新しいルールを追加できます。

知識の一元化

ルールを使用して、実行可能な知識のリポジトリ(知識ベース)を作成します。これは、ビジネスポリシーの信頼できる唯一の情報源です。理想的には、ルールは非常に読みやすいので、ドキュメントとしても使用できます。

ツールの統合

Eclipseなどのツールは、ルールを編集および管理し、フィードバック、検証、およびコンテンツ支援を即座に取得する方法を提供します。監査およびデバッグツールも利用できます。

Droolsプラグインをインストールするための前提条件は次のとおりです-

  • Java 1.5(またはそれ以降)SE JDK
  • Eclipse 4.2(または任意のバージョン)とDroolsプラグイン

DroolsはJavaで記述されたBRMS(ビジネスルール管理システム)であるため、このセクションでは、必要なプラグインを追加する方法について説明します。最大のJavaユーザーがEclipseを使用することを考慮して、EclipseにDrools5.x.0プラグインを追加する方法を見てみましょう。

ステップ1:バイナリをダウンロードする

次のリンクからバイナリをダウンロードします-

https://download.jboss.org/drools/release/5.3.0.Final/

ダウンロードが完了したら、ファイルをハードディスクに解凍します。

ステップ2:ソフトウェアをインストールする

Eclipseを起動し、ヘルプ→新しいソフトウェアのインストールに移動します。次のスクリーンショットに示すように、[追加]をクリックします。

その後、ここに示すように[ローカル]をクリックし、[…/ binarys /org.drools.updatesite]を選択します。

DroolsとjBPMを選択し、[次へ]をクリックします。

もう一度[次へ]をクリックします。その後、条件と使用許諾契約に同意し、[完了]をクリックします。

[完了]をクリックすると、ソフトウェアのインストールが開始されます-

インストールが正常に完了すると、次のダイアログボックスが表示されます-

はいをクリックします。Eclipseが再起動したら、Windows→環境設定に移動します

あなたはあなたの好みの下でDroolsを見ることができます。これでDroolsプラグインのインストールが完了しました。

Droolsランタイムは、特定のバージョンのDroolsjarでプログラムを実行するようにエディターに指示するために必要です。プログラム/アプリケーションは、さまざまなDroolsランタイムで実行できます。

Windows→設定→Drools→インストール済みDroolsランタイムをクリックします。次に、次のスクリーンショットに示すように、[追加]をクリックします。

その後、次に示すように、[Create a new DroolsRuntime]をクリックします。

droolsjbpm-tools-distribution-5.3.0.Final.zipをダウンロードしたbinariesフォルダーまでのパスを入力します

[OK]をクリックして、Droolsランタイムの名前を入力します。Droolsランタイムが作成されました。

基本的なDroolsプログラムを作成するには、Eclipseを開きます。Fileb→New→Projectに移動します。

Droolsプロジェクトを選択します。プロジェクトに適切な名前を付けます。たとえば、DroolsTestです。

次の画面では、最初のDroolsプロジェクトで必要なファイルを選択するように求められます。

最初の2つのファイルを選択します。最初のファイルは.drlファイル(Drools Rule File)であり、2番目のファイルはHelloWorldルールをロードして実行するためのJavaクラスです。

[次へ]→[完了]をクリックします。

[完了]をクリックすると、<DroolsTest>プロジェクトがワークスペースに作成されます。Javaクラスを開き、右クリックしてJavaアプリケーションとして実行します。ここに示すような出力が表示されます-

次に、ルールエンジンで頻繁に使用される用語について説明します。

ルール

条件を指定するルールエンジンの心臓部(「a」の場合は「b」)。

事実

事実は、ルールが作用するデータです。Javaの観点からは、ファクトはPOJO(Plain Old Java Object)です。

セッション

Droolsのナレッジセッションは、ルールを実行するためのコアコンポーネントです。すべてのルールとその他のリソースを保持するのはナレッジセッションです。ナレッジセッションはナレッジベースから作成されます。

ルールエンジンが機能するために、ファクトがセッションに挿入され、条件が満たされると、後続のルールが実行されます。セッションには2つのタイプがあります-

  • ステートレスナレッジセッション
  • ステートフルナレッジセッション

議題

それは論理的な概念です。アジェンダは、アクティベーションが実行されるのを待っている論理的な場所です。

アクティベーション

アクティベーションは thenルールの一部。アクティベーションは、適切なルールが実行されるアジェンダに配置されます。

Hello Worldプロジェクト(Sample.drl)で記述されているデフォルトのルールが表示されている場合は、ここで説明する多くのキーワードが使用されています。

Sample.drl

  • Package−すべてのルールはパッケージ名で始まります。パッケージは、ルールの名前空間として機能します。パッケージ内のルール名は一意である必要があります。ルールのパッケージは、Javaのパッケージに似ています。

  • Import statement−ルールを適用するファクトが何であれ、それらのファクトをインポートする必要があります。たとえば、com.sample.DroolsTest.Message; 上記の例では。

  • Rule Definition−ルール名、条件、および結果で構成されます。Droolsのキーワードはrule, when, then, そして end。上記の例では、ルール名は「HelloWorld」と「GoodBye」です。ザ・when 一部はルールとルールの両方の条件です then一部は結果です。ルールの用語では、when 一部はLHS(左側)とも呼ばれ、 then ルールのRHS(右側)としての部分。

ここで、Droolsのロードとルールの実行に使用されるJavaファイルで使用される用語について説明します。

知識ベース

ナレッジベースは、ルール、プロセス、および内部タイプのコレクションを管理するインターフェイスです。パッケージに含まれていますorg.drools.KnowledgeBase。Droolsでは、これらは一般にknowledge definitions または knowledge。知識の定義はにグループ化されますknowledge packages。知識の定義は追加または削除できます。ナレッジベースの主な目的は、作成に費用がかかるため、それらを保存して再利用することです。ナレッジベースは、ナレッジセッションを作成するためのメソッドを提供します。

ナレッジセッション

ナレッジセッションは、ナレッジベースから取得されます。これは、Droolsエンジンと対話するためのメインインターフェイスです。知識セッションには2つのタイプがあります-

  • ステートレスナレッジセッション

  • ステートフルナレッジセッション

ステートレスナレッジセッション

ステートレスナレッジセッションは、推論を利用せずに、最も単純なユースケースを形成するステートレスセッションです。ステートレスセッションは、関数のように呼び出すことができ、データを渡してから結果を受け取ります。ステートレスセッションの一般的な例は次のとおりです。

  • Validation

    • この人は住宅ローンの資格がありますか?

  • Calculation

    • 住宅ローンの保険料を計算します。

  • Routing and Filtering

    • 電子メールなどの受信メッセージをフォルダーにフィルターします。

    • 着信メッセージを宛先に送信する

ステートフルナレッジセッション

ステートフルセッションは存続期間が長く、時間の経過とともに繰り返し変更できます。ステートフルセッションの一般的な使用例には、次のものがあります。

  • Monitoring

    • 半自動購入のための株式市場の監視と分析。

  • Diagnostics

    • 故障発見、医療診断

  • Logistics

    • 小包の追跡と配達のプロビジョニング

ナレッジビルダー

KnoledgeBuilderインターフェースは、ナレッジ定義(ルール、プロセス、タイプ)からKnowledgePackageを構築する役割を果たします。パッケージに含まれていますorg.drools.builder.KnowledgeBuilder。知識の定義はさまざまな形式にすることができます。ビルドに問題がある場合、KnowledgeBuilderは次の2つの方法でエラーを報告します。hasErrors そして getError

次の図は、プロセスを説明しています

上記の例では、ステートレスナレッジセッションの簡単な例を取り上げているため、セッションにファクトを挿入した後、fireAllRules()メソッドが呼び出され、出力が表示されます。

ステートフルナレッジセッションの場合、ルールが実行されると、ステートフルナレッジセッションオブジェクトはメソッドを呼び出す必要があります dispose() セッションを解放し、メモリリークを回避します。

.drl(ルールファイル)には独自の構文があるので、この章ではルール構文の一部について説明します。

ルールの条件

ルールには、次のような多くの条件とパターンを含めることができます。

  • アカウント(残高== 200)
  • 顧客(名前==「Vivek」)

上記の条件は、口座残高が200であるか、顧客名が「Vivek」であるかを確認します。

ルールの変数

Droolsの変数名は、Dollar($)記号で始まります。

  • $ account − Account()
  • $ accountはAccount()クラスの変数です

Droolsは、すべてのネイティブJavaタイプ、さらにはEnumでも機能します。

ルールのコメント

特殊文字#または//は、単一行コメントをマークするために使用できます。

複数行コメントの場合は、次の形式を使用します。

/*
   Another line
   .........
   .........
*/

グローバル変数

グローバル変数は、セッションに割り当てられた変数です。次のようにさまざまな理由で使用できます-

  • 入力パラメーターの場合(たとえば、セッションごとにカスタマイズできる定数値)。

  • 出力パラメーターの場合(たとえば、レポート-ルールはグローバルレポート変数にメッセージを書き込むことができます)。

  • ルール内で使用できるロギングなどのサービスのエントリポイント。

ルールの機能

機能は便利な機能です。それらは条件と結果で使用することができます。関数は、ユーティリティ/ヘルパークラスの代替を表します。例えば、

function double calculateSquare (double value) {
   return value * value;
}

方言

方言は、条件または結果にあるコード式で使用される構文を指定します。これには、戻り値、評価、インライン評価、述語、顕著性式、結果などが含まれます。デフォルト値はJava。Droolsは現在、と呼ばれるもう1つの方言をサポートしていますMVEL。デフォルトの方言は、パッケージレベルで次のように指定できます-

package org.mycompany.somePackage
dialect "mvel"

MVEL方言

MVELは、Javaベースのアプリケーション用の表現​​言語です。フィールドおよびメソッド/ゲッターアクセスをサポートします。これはJava構文に基づいています。

顕著性

顕著性は、ルール構文の非常に重要な機能です。Salienceは、競合解決戦略で使用され、最初に実行するルールを決定します。デフォルトでは、これが主な基準です。

顕著性を使用して、発砲ルールの順序を定義できます。Salienceには1つの属性があり、int型の数を返す式を取ります(正の数と負の数が有効です)。値が高いほど、競合解決戦略によってルールが選択されて実行される可能性が高くなります。

salience ($account.balance * 5)

デフォルトのsalience値は0です。salience値を一部のルールにのみ割り当てる場合は、このことに注意する必要があります。

ルール構文には他にも多くの機能/パラメーターがありますが、ここでは重要なものだけを取り上げました。

ルール結果キーワード

ルール結果キーワードは、「thenルールの一部。

  • Modify −ファクトの属性は、で変更できます。 then ルールの一部。

  • Insert −ある条件に基づいて、trueの場合、ルールエンジンの現在のセッションに新しいファクトを挿入できます。

  • Retract −特定の条件がルールで真であり、そのファクトに対して他に何も実行したくない場合は、ルールエンジンから特定のファクトを撤回できます。

Note−ルールの結果内に条件付きロジック(ifステートメント)を含めることは非常に悪い習慣と見なされます。ほとんどの場合、新しいルールを作成する必要があります。

この章では、次の問題ステートメントのDroolsプロジェクトを作成します-

都市と製品の種類(都市と製品の組み合わせ)に応じて、その都市に関連する地方税を調べます。

Droolsプロジェクト用に2つのDRLファイルがあります。2つのDRLファイルは、検討中の2つの都市(プネとナグプール)と4つのタイプの製品(食料品、医薬品、時計、高級品)を示します。

  • 両都市の医薬品に対する税金はゼロと見なされます。

  • 食料品については、プネで2ルピー、ナグプールで1ルピーの税金を想定しています。

異なる出力を示すために、同じ販売価格を使用しました。すべてのルールがアプリケーションで実行されていることに注意してください。

各itemTypeを保持するモデルは次のとおりです-

package com.sample;
import java.math.BigDecimal;
public class ItemCity {
   public enum City {
      PUNE, NAGPUR
   }
   public enum Type {
      GROCERIES, MEDICINES, WATCHES, LUXURYGOODS
   }
   private City purchaseCity;
   private BigDecimal sellPrice;
   private Type typeofItem;
   private BigDecimal localTax;
   
   public City getPurchaseCity() {
      return purchaseCity;
   }
   public void setPurchaseCity(City purchaseCity) {
      this.purchaseCity = purchaseCity;
   }
   public BigDecimal getSellPrice() {
      return sellPrice;
   }
   public void setSellPrice(BigDecimal sellPrice) {
      this.sellPrice = sellPrice;
   }
   public Type getTypeofItem() {
      return typeofItem;
   }
   public void setTypeofItem(Type typeofItem) {
      this.typeofItem = typeofItem;
   }
   public BigDecimal getLocalTax() {
      return localTax;
   }
   public void setLocalTax(BigDecimal localTax) {
      this.localTax = localTax;
   }
}

DRLファイル

前に提案したように、ここでは2つのDRLファイル(Pune.drlとNagpur.drl)を使用しました。

Pune.drl

これは、プネ市のルールを実行するDRLファイルです。

// created on: Dec 24, 2014
package droolsexample

// list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal;

// 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()));
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()));
end

Nagpur.drl

これは、ナグプール市のルールを実行するDRLファイルです。

// created on: Dec 26, 2014
package droolsexample

// list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal;

// 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()));
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()));
end

都市に基づいてDRLファイルを作成しました。これにより、新しい都市が追加された場合に、後で任意の数のルールファイルを追加できるようになります。

すべてのルールがルールファイルからトリガーされていることを示すために、2つのアイテムタイプ(医薬品と食料品)を使用しました。薬は非課税で、食料品は市ごとに課税されます。

テストクラスはルールファイルをロードし、ファクトをセッションに挿入して、出力を生成します。

Droolstest.java

package com.sample;

import java.math.BigDecimal;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import com.sample.ItemCity.City;
import com.sample.ItemCity.Type;

/* 
   *This is a sample class to launch a rule. 
*/

public class DroolsTest {
   public static final void main(String[] args) {
      try {
         // load up the knowledge base
         KnowledgeBase kbase = readKnowledgeBase();
         StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
         
         ItemCity item1 = new ItemCity();
         item1.setPurchaseCity(City.PUNE);
         item1.setTypeofItem(Type.MEDICINES);
         item1.setSellPrice(new BigDecimal(10));
         ksession.insert(item1);
         
         ItemCity item2 = new ItemCity();
         item2.setPurchaseCity(City.PUNE);
         item2.setTypeofItem(Type.GROCERIES);
         item2.setSellPrice(new BigDecimal(10));
         ksession.insert(item2);
         
         ItemCity item3 = new ItemCity();
         item3.setPurchaseCity(City.NAGPUR);
         item3.setTypeofItem(Type.MEDICINES);
         item3.setSellPrice(new BigDecimal(10));
         ksession.insert(item3);
         
         ItemCity item4 = new ItemCity();
         item4.setPurchaseCity(City.NAGPUR);
         item4.setTypeofItem(Type.GROCERIES);
         item4.setSellPrice(new BigDecimal(10));         
         ksession.insert(item4);
         
         ksession.fireAllRules();
         
         System.out.println(item1.getPurchaseCity().toString() + " " 
            + item1.getLocalTax().intValue());
         
         System.out.println(item2.getPurchaseCity().toString() + " "
            + item2.getLocalTax().intValue());
         
         System.out.println(item3.getPurchaseCity().toString() + " "
            + item3.getLocalTax().intValue());
         
         System.out.println(item4.getPurchaseCity().toString() + " "
            + item4.getLocalTax().intValue());
                            
      } catch (Throwable t) {
         t.printStackTrace();
      }
   }
   private static KnowledgeBase readKnowledgeBase() throws Exception {
      KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
      kbuilder.add(ResourceFactory.newClassPathResource("Pune.drl"), ResourceType.DRL);
      kbuilder.add(ResourceFactory.newClassPathResource("Nagpur.drl"), ResourceType.DRL);
      KnowledgeBuilderErrors errors = kbuilder.getErrors();
      
      if (errors.size() > 0) {
         for (KnowledgeBuilderError error: errors) {
            System.err.println(error);
         }
         throw new IllegalArgumentException("Could not parse knowledge.");
      }
      KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
      kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
      return kbase;
   }
}

このプログラムを実行すると、その出力は次のようになります。

PUNE 0
PUNE 20
NAGPUR 0
NAGPUR 10

プネとナグプールの両方で、アイテムが薬の場合、地方税はゼロです。一方、商品が食料品の場合、税金は市ごとに異なります。他の製品のDRLファイルにさらにルールを追加できます。これは単なるサンプルプログラムです。

DRLファイルから外部関数を呼び出す

ここでは、DRLファイル内のJavaファイルから静的関数を呼び出す方法を示します。

まず、クラスを作成します HelloCity.java 同じパッケージで com.sample

package com.sample;

public class HelloCity {
   public static void writeHello(String name) {
      System.out.println("HELLO " + name + "!!!!!!");
   }
}

その後、DRLファイルにimportステートメントを追加して、DRLファイルからwriteHelloメソッドを呼び出します。次のコードブロックでは、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;

//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());
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()));
end

プログラムを再度実行すると、その出力は次のようになります。

HELLO PUNE!!!!!!
PUNE 0
PUNE 20
NAGPUR 0
NAGPUR 10

現在の出力の違いは黄色でマークされており、Javaクラスの静的メソッドの出力を示しています。

Javaメソッドを呼び出す利点は、Javaで任意のユーティリティ/ヘルパー関数を記述し、DRLファイルから同じものを呼び出すことができることです。

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の場合にのみ機能します。