Drools-quick-guide
よだれ-はじめに
Javaエンタープライズレベルのアプリケーションは、3つの部分に分割できます-
- UI-ユーザーインターフェイス(フロントエンド)
- データベースに接続されているサービス層
- ビジネス層
たとえば、SpringやStrutsなど、UIとサービスレイヤーを一緒に処理する多くのフレームワークがあります。 しかし、Droolsが登場するまで、ビジネスロジックを処理する標準的な方法はありませんでした。
Droolsとは何ですか?
Droolsは*ビジネスロジック統合プラットフォーム(BLiP)*です。 それはJavaで書かれています。 これは、JBossおよびRed Hat、Inc.が支援するオープンソースプロジェクトです。 Reteパターンマッチングアルゴリズムを拡張および実装します。
素人の言葉で言えば、Droolsは、ビジネスプロセス内で見つかったロジックとデータを分離し、推論することができるツールのコレクションです。 注意が必要な2つの重要なキーワードは、 Logic と Data です。
Droolsは、 Authoring と Runtime の2つの主要部分に分かれています。
- オーサリング-オーサリングプロセスには、ルールファイル(.DRLファイル)の作成が含まれます。
- 実行時-作業メモリの作成とアクティベーションの処理が含まれます。
ルールエンジンとは何ですか?
Droolsは、ルールベースのアプローチを使用してエキスパートシステムを実装するルールエンジンまたは生産ルールシステムです。 エキスパートシステムは、知識表現を使用して、獲得した知識を推論に使用できる知識ベースに処理する知識ベースのシステムです。
プロダクションルールシステムは、知識表現に焦点を当てたチューリング完全であり、命題および一次論理を簡潔で、曖昧さのない、宣言的な方法で表現します。
プロダクションルールシステムの頭脳は、多数のルールとファクトに対応できる*推論エンジン*です。 推論エンジンは、ファクトとデータをプロダクションルール( Productions または単に*ルール*とも呼ばれます)と照合して、アクションをもたらす結論を推測します。
プロダクションルールは、ナレッジ表現を推論するために1次ロジックを使用する2つの部分からなる構造です。 ビジネスルールエンジンは、ランタイム実稼働環境で1つ以上のビジネスルールを実行するソフトウェアシステムです。
ルールエンジンを使用すると、「 How to do 」ではなく「 What to Do 」を定義できます。
ルールとは何ですか?
ルールは、「何らかの条件が発生したときに、いくつかのタスクを実行するときに」と表現されることが多い知識です。
When
<Condition is true>
Then
<Take desired Action>
ルールの最も重要な部分は、 when 部分です。 when 部分が満たされると、 then 部分がトリガーされます。
rule <rule_name>
<attribute> <value>
when
<conditions>
then
<actions>
end
パターンマッチング
新規または既存のファクトをプロダクションルールと照合するプロセスは、パターンマッチングと呼ばれ、推論エンジンによって実行されます。 を含むパターンマッチングに使用されるアルゴリズムの数があります-
- リニア
- Rete
- 御Treat走
- 飛躍
Drools Reteアルゴリズムを実装および拡張します。 Drools Reteの実装はReteOOと呼ばれ、Droolsがオブジェクト指向システム用のReteアルゴリズムの実装を強化および最適化したことを意味します。
ルールエンジンの利点
宣言的プログラミング
ルールを使用すると、難しい問題の解決策を簡単に表現でき、解決策も検証できます。 コードとは異なり、ルールはそれほど複雑ではない言語で記述されています。ビジネスアナリストは、一連のルールを簡単に読み取り、検証できます。
ロジックとデータの分離
データはドメインオブジェクトにあり、ビジネスロジックはルールにあります。 プロジェクトの種類に応じて、この種の分離は非常に有利です。
速度とスケーラビリティ
Droolsが記述されているRete OOアルゴリズムは、すでに実証済みのアルゴリズムです。 Droolsの助けを借りて、アプリケーションは非常にスケーラブルになります。 頻繁な変更要求がある場合、既存のルールを変更することなく新しいルールを追加できます。
知識の集中化
ルールを使用して、実行可能な知識のリポジトリ(知識ベース)を作成します。 これは、ビジネスポリシーの唯一の真実です。 理想的には、ルールは非常に読みやすいため、ドキュメントとしても使用できます。
ツール統合
Eclipseなどのツールは、ルールを編集および管理し、すぐにフィードバック、検証、およびコンテンツ支援を取得する方法を提供します。 監査およびデバッグツールも利用できます。
Drools-Eclipseプラグイン
Droolsプラグインをインストールするための前提条件は次のとおりです-
- Java 1.5(またはそれ以上)SE JDK
- Eclipse 4.2(または任意のバージョン)およびDroolsプラグイン
DroolsはJavaで記述されたBRMS(ビジネスルール管理システム)であるため、このセクションでは目的のプラグインを追加する方法について説明します。 最大のJavaユーザーがEclipseを使用することを考慮して、EclipseでDrools 5.x.0プラグインを追加する方法を見てみましょう。
ステップ1:バイナリをダウンロードする
次のリンクからバイナリをダウンロードします-
https://download.jboss.org/drools/release/5.3.0.Final/
ダウンロードが完了したら、ファイルをハードディスクに抽出します。
ステップ2:ソフトウェアをインストールする
Eclipseを起動し、ヘルプ→新しいソフトウェアをインストールします。 次のスクリーンショットに示すように、「追加」をクリックします。
その後、ここに示すようにローカルをクリックして、「…/binaries/org.drools.updatesite」を選択します。
DroolsとjBPMを選択して、[次へ]をクリックします。
再び「次へ」をクリックします。 その後、条項とライセンス契約に同意し、[完了]をクリックします。
[完了]をクリックすると、ソフトウェアのインストールが開始されます-
インストールが成功すると、次のダイアログボックスが表示されます-
はいをクリックします。 Eclipseが再起動したら、Windows→環境設定に移動します
あなたの好みでDroolsを見ることができます。 Droolsプラグインのインストールが完了しました。
Drools-ランタイム
Droolsランタイムは、特定のバージョンのDrools jarでプログラムを実行するようエディターに指示するために必要です。 さまざまなDroolsランタイムでプログラム/アプリケーションを実行できます。
Windows→Preference→Drools→Installed Drools Runtimeをクリックします。 次に、次のスクリーンショットに示すように[追加]をクリックします。
その後、ここに示すように[新しいDroolsランタイムの作成]をクリックします。
droolsjbpm-tools-をダウンロードしたバイナリフォルダーまでのパスを入力します。 distribution-5.3.0.Final.zip
[OK]をクリックして、Droolsランタイムの名前を指定します。 Droolsランタイムが作成されました。
Drools-Droolsプログラムを作成する
基本的なDroolsプログラムを作成するには、Eclipseを開きます。 Fileb→新規→プロジェクトに移動します。
Drools Projectを選択します。 プロジェクトに適切な名前を付けます。 たとえば、DroolsTest。
次の画面では、最初のDroolsプロジェクトで必要なファイルを選択するよう求められます。
最初の2つのファイルを選択します。 最初のファイルは.drlファイル(Droolsルールファイル)で、2番目のファイルはHelloWorldルールをロードして実行するためのJavaクラスです。
[次へ]→[完了]をクリックします。
[完了]をクリックすると、ワークスペースに<DroolsTest>プロジェクトが作成されます。 Javaクラスを開き、右クリックしてJavaアプリケーションとして実行します。 ここに示すように出力が表示されます-
次に、ルールエンジンで頻繁に使用される用語について説明します。
Drools-よく使用される用語
規則
条件を指定するルールエンジンの中心(「a」の場合は「b」)。
事実
ファクトは、ルールが適用されるデータです。 Javaの観点から見ると、ファクトはPOJO(Plain Old Java Object)です。
セッション
Droolsのナレッジセッションは、ルールを実行するコアコンポーネントです。 すべてのルールおよびその他のリソースを保持するのはナレッジセッションです。 ナレッジセッションは、KnowledgeBaseから作成されます。
ルールエンジンが機能するために、ファクトがセッションに挿入され、条件が満たされると、後続のルールが実行されます。 セッションは2種類あります-
- ステートレスナレッジセッション
- ステートフルナレッジセッション
議題
それは論理的な概念です。 アジェンダは、アクティベーションが実行されるのを待っている論理的な場所です。
アクティベーション
アクティベーションは、ルールの*そして*部分です。 アクティベーションは、適切なルールが実行されるアジェンダに配置されます。
よだれ-ルールの記述
Hello Worldプロジェクト(Sample.drl)に記述されているデフォルトルールが表示されている場合は、ここで説明する多くのキーワードが使用されています。
Sample.drl
- パッケージ-すべてのルールはパッケージ名で始まります。 パッケージは、ルールのネームスペースとして機能します。 パッケージ内のルール名は一意である必要があります。 ルールのパッケージは、Javaのパッケージに似ています。
- Import statement -ルールを適用するファクトが何であれ、それらのファクトをインポートする必要があります。 たとえば、com.sample.DroolsTest.Message;上記の例では。
- ルール定義-ルール名、条件、および結果で構成されます。 Droolsキーワードは* rule、when、then、および *end です。 上記の例では、ルール名は「Hello World」と「GoodBye」です。 when 部分はルールの両方の条件であり、 then 部分は結果です。 ルール用語では、 when 部分はルールのLHS(左側)とも呼ばれ、 then 部分はルールのRHS(右側)とも呼ばれます。
ここで、Droolsのロードとルールの実行に使用されるJavaファイルで使用される用語を見ていきましょう。
知識ベース
ナレッジベースは、ルール、プロセス、および内部タイプのコレクションを管理するインターフェースです。 パッケージ org.drools.KnowledgeBase に含まれています。 Droolsでは、これらは一般に*ナレッジ定義*または*ナレッジ*と呼ばれます。 ナレッジ定義は*ナレッジパッケージ*にグループ化されます。 ナレッジ定義は追加または削除できます。 ナレッジベースの主な目的は、作成に費用がかかるため、保存して再利用することです。 ナレッジベースは、ナレッジセッションを作成する方法を提供します。
ナレッジセッション
ナレッジセッションは、ナレッジベースから取得されます。 これは、Drools Engineと対話するためのメインインターフェイスです。 ナレッジセッションは2つのタイプにすることができます-
- ステートレスナレッジセッション
- ステートフルナレッジセッション
ステートレスナレッジセッション
ステートレスナレッジセッションは、推論を利用せず、最も単純なユースケースを形成するステートレスセッションです。 ステートレスセッションは、関数のように呼び出してデータを渡し、結果を受け取ることができます。 ステートレスセッションの一般的な例は次のとおりです-
- 検証
- この人は住宅ローンの資格がありますか?
- 計算
- 住宅ローンのプレミアムを計算します。
- ルーティングとフィルタリング
- メールなどの受信メッセージをフォルダーにフィルターします。
- 宛先に着信メッセージを送信する
ステートフルナレッジセッション
ステートフルセッションはより長く存続し、時間の経過とともに反復的な変更を可能にします。 ステートフルセッションの一般的な使用例には、次のものがあります-
- モニタリング
- 半自動購入のための株式市場の監視と分析。
- 診断
- 障害発見、医療診断
- ロジスティクス
- 荷物の追跡と配達のプロビジョニング
ナレッジビルダー
KnoledgeBuilderインターフェースは、ナレッジ定義(ルール、プロセス、タイプ)からKnowledgePackageを構築します。 パッケージ org.drools.builder.KnowledgeBuilder 内に含まれています。 知識の定義はさまざまな形式にすることができます。 ビルドに問題がある場合、KnowledgeBuilderは、 hasErrors および getError の2つのメソッドを通じてエラーを報告します。
次の図はプロセスを説明しています
上記の例では、ステートレスナレッジセッションの簡単な例を取り上げているため、セッションにファクトを挿入し、fireAllRules()メソッドが呼び出されて出力が表示されます。
ステートフルナレッジセッションの場合、ルールが実行されると、ステートフルナレッジセッションオブジェクトはメソッド* dispose()*を呼び出してセッションを解放し、メモリリークを回避する必要があります。
Drools-ルールの構文
ルールの条件
drl(ルールファイル)には独自の構文があるのを見たように、この章でルールの構文の一部をカバーしましょう。.
ルールには、次のような多くの条件とパターンを含めることができます-
- アカウント(残高== 200)
- 顧客(名前==“ Vivek”)
上記の条件は、口座残高が200であるか、顧客名が「Vivek」であるかどうかを確認します。
ルールの変数
Droolsの変数名は、ドル($)記号で始まります。
- $ account −アカウント()
- $ accountはAccount()クラスの変数です
Droolsは、すべてのネイティブJava型、さらにはEnumでも機能します。
ルールのコメント
特殊文字#または//を使用して、単一行のコメントをマークできます。
複数行コメントの場合、次の形式を使用します。
/*
Another line
.........
.........
*/
グローバル変数
グローバル変数は、セッションに割り当てられた変数です。 彼らは次のようにさまざまな理由で使用することができます-
- 入力パラメータの場合(たとえば、セッションごとにカスタマイズできる定数値)。
- 出力パラメーターの場合(たとえば、レポート-ルールはメッセージをグローバルレポート変数に書き込むことができます)。 *ルール内で使用できるロギングなどのサービスのエントリポイント。
ルール内の関数
関数は便利な機能です。 それらは条件と結果に使用できます。 関数は、ユーティリティ/ヘルパークラスの代替を表します。 例えば、
function double calculateSquare (double value) {
return value* value;
}
方言
方言は、条件または結果にあるコード式で使用される構文を指定します。 戻り値、評価、インライン評価、述語、顕著性表現、結果などが含まれます。 デフォルト値は Java です。 Droolsは現在、 MVEL と呼ばれるもう1つの方言をサポートしています。 デフォルトの方言は、次のようにパッケージレベルで指定できます-
package org.mycompany.somePackage
dialect "mvel"
MVEL方言
MVELは、Javaベースのアプリケーション用の式言語です。 フィールドおよびメソッド/ゲッターアクセスをサポートします。 Java構文に基づいています。
サリエンス
Salienceは、ルール構文の非常に重要な機能です。 Salienceは、どのルールを最初に実行するかを決定するために、競合解決戦略で使用されます。 デフォルトでは、これが主要な基準です。
salienceを使用して、起動ルールの順序を定義できます。 Salienceには1つの属性があり、int型の数を返す式を受け取ります(正の数と負の数が有効です)。 値が高いほど、競合解決戦略によってルールが選択されて実行される可能性が高くなります。
salience ($account.balance * 5)
デフォルトのsalience値は0です。 顕著性の値をいくつかのルールのみに割り当てる場合は、このことに留意する必要があります。
ルール構文には他にも多くの機能/パラメーターがありますが、ここでは重要なもののみを取り上げました。
ルール結果キーワード
ルール結果キーワードは、ルールの「 then 」部分で使用されるキーワードです。
- 変更-ファクトの属性は、ルールの*その後*の部分で変更できます。
- 挿入-何らかの条件に基づいて、trueの場合、ルールエンジンの現在のセッションに新しいファクトを挿入できます。
- Retract -ルール内の特定の条件が真であり、そのファクトに対して他のアクションを実行したくない場合は、ルールエンジンから特定のファクトをリトラクトできます。
注-ルールの結果内に条件付きロジック(ifステートメント)を含めることは非常に悪い習慣と見なされます。 ほとんどの場合、新しいルールを作成する必要があります。
Drools-サンプルDroolsプログラム
この章では、次の問題ステートメントのためのDroolsプロジェクトを作成します-
'__都市と製品の種類(都市と製品の組み合わせ)に応じて、その都市に関連する地方税を調べます。'__
Droolsプロジェクト用に2つのDRLファイルを作成します。 2つのDRLファイルは、検討中の2つの都市(PuneとNagpur)と4つのタイプの製品(食料品、医薬品、時計、高級品)を意味します。
- 両都市の医薬品に対する税金はゼロとみなされます。
- 食料品については、プネでRs 2、ナグプールでRs 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ファイル
前述のとおり、ここではPune.drlとNagpur.drlの2つの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ファイルから静的関数を呼び出す方法を示します。
まず、同じパッケージ com.sample に HelloCity.java クラスを作成します。
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-デバッグ
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の場合にのみ機能します。