9.2. Hello World の例のデシジョン (基本ルールおよびデバッグ)
Hello World のデシジョンセットの例では、オブジェクトをデシジョンエンジンのワーキングメモリーに挿入する方法、ルールを使用してオブジェクトを一致させる方法、エンジンの内部アクティビティーを追跡するロギングの設定方法を説明します。
以下は、Hello World の例の概要です。
-
名前:
helloworld
-
Main クラス: (
src/main/java
内の)org.drools.examples.helloworld.HelloWorldExample
-
モジュール:
drools-examples
- タイプ: Java アプリケーション
-
ルールファイル: (
src/main/resources
内の)org.drools.examples.helloworld.HelloWorld.drl
- 目的: 基本的なルール実行とデバッグ出力の使用方法を例示します。
Hello World の例では、KIE セッションが生成されて、ルールの実行が可能になります。すべてのルールは、実行するのに KIE セッションが必要です。
ルール実行の KIE セッション
KieServices ks = KieServices.Factory.get(); 1 KieContainer kc = ks.getKieClasspathContainer(); 2 KieSession ksession = kc.newKieSession("HelloWorldKS"); 3
Red Hat Decision Manager プロジェクトのパッケージ化に関する詳細は、Red Hat Decision Manager プロジェクトのパッケージ化およびデプロイ を参照してください。
Red Hat Decision Manager には、内部エンジンアクティビティーを公開するイベントモデルがあります。デフォルトのデバッグリスナー DebugAgendaEventListener
と DebugRuleRuntimeEventListener
により、デバッグイベント情報が System.err
の出力に表示されます。KieRuntimeLogger
では、実行監査と、グラフィックビューワーで確認可能な結果が提供されます。
リスナーと監査ロガーのデバッグ
// Set up listeners. ksession.addEventListener( new DebugAgendaEventListener() ); ksession.addEventListener( new DebugRuleRuntimeEventListener() ); // Set up a file-based audit logger. KieRuntimeLogger logger = KieServices.get().getLoggers().newFileLogger( ksession, "./target/helloworld" ); // Set up a ThreadedFileLogger so that the audit view reflects events while debugging. KieRuntimeLogger logger = ks.getLoggers().newThreadedFileLogger( ksession, "./target/helloworld", 1000 );
ロガーは、Agenda
と RuleRuntime
リスナーにビルドされる特別な実装です。デシジョンエンジンが実行を終えると、logger.close()
が呼び出されます。
この例では、"Hello World"
というメッセージを含む Message
オブジェクトを作成し、ステータス HELLO
を KieSession
に挿入して、fireAllRules()
でルールを実行します。
データの挿入および実行
// Insert facts into the KIE session. final Message message = new Message(); message.setMessage( "Hello World" ); message.setStatus( Message.HELLO ); ksession.insert( message ); // Fire the rules. ksession.fireAllRules();
ルール実行は、データモデルを使用して、KieSession
への出入力としてデータを渡します。この例のデータモデルには message
(String
) と status
(HELLO
または GOODBYE
) の 2 つのフィールドが含まれます。
データモデルクラス
public static class Message { public static final int HELLO = 0; public static final int GOODBYE = 1; private String message; private int status; ... }
この 2 つのルールは、src/main/resources/org/drools/examples/helloworld/HelloWorld.drl
ファイルに配置されます。
"Hello World"
ルールの when
条件では、ステータスが Message.HELLO
の KIE セッションに、Message
オブジェクトが挿入されるたびに、このルールをアクティベートすると記述しています。さらに、変数のバインドが 2 つ作成されます (message
変数を message
属性に、m
変数を一致する Message
オブジェクト自体にバインド)。
ルールの then
アクションは、バインドされた変数 message
のコンテンツを System.out
に出力するよう指定し、続いて m
にバインドされている Message
オブジェクトの message
と status
属性値を変更します。このルールは modify
ステートメントを使用して、1 つのステートメントに割り当てブロックを適用し、ブロックの最後にデシジョンエンジンにこの変更について通知します。
"Hello World" のルール
rule "Hello World" when m : Message( status == Message.HELLO, message : message ) then System.out.println( message ); modify ( m ) { message = "Goodbye cruel world", status = Message.GOODBYE }; end
"Good Bye"
ルールは、ステータスが Message.GOODBYE
の Message
オブジェクトと一致する点を除き、"Hello World"
ルールによく似ています。
"Good Bye" ルール
rule "Good Bye" when Message( status == Message.GOODBYE, message : message ) then System.out.println( message ); end
この例を実行するには、org.drools.examples.helloworld.HelloWorldExample
クラスを IDE で Java アプリケーションとして実行します。このルールは System.out
に、デバッグリスナーは System.err
に書き込み、監査ロガーは target/helloworld.log
のログファイルを作成します。
IDE コンソールの System.out 出力
Hello World Goodbye cruel world
IDE コンソールでの System.err の出力
==>[ActivationCreated(0): rule=Hello World; tuple=[fid:1:1:org.drools.examples.helloworld.HelloWorldExample$Message@17cec96]] [ObjectInserted: handle=[fid:1:1:org.drools.examples.helloworld.HelloWorldExample$Message@17cec96]; object=org.drools.examples.helloworld.HelloWorldExample$Message@17cec96] [BeforeActivationFired: rule=Hello World; tuple=[fid:1:1:org.drools.examples.helloworld.HelloWorldExample$Message@17cec96]] ==>[ActivationCreated(4): rule=Good Bye; tuple=[fid:1:2:org.drools.examples.helloworld.HelloWorldExample$Message@17cec96]] [ObjectUpdated: handle=[fid:1:2:org.drools.examples.helloworld.HelloWorldExample$Message@17cec96]; old_object=org.drools.examples.helloworld.HelloWorldExample$Message@17cec96; new_object=org.drools.examples.helloworld.HelloWorldExample$Message@17cec96] [AfterActivationFired(0): rule=Hello World] [BeforeActivationFired: rule=Good Bye; tuple=[fid:1:2:org.drools.examples.helloworld.HelloWorldExample$Message@17cec96]] [AfterActivationFired(4): rule=Good Bye]
この例の実行フローをさらに理解するには、target/helloworld.log
の監査ログファイルを IDE デバッグビュー (または Audit View が利用できる場合は Audit View (例: IDE の Window
この例では、Audit view で、オブジェクトが挿入され、"Hello World"
ルールのアクティベーションが作成されます。次に、このアクティベーションが実行され、Message
オブジェクトを更新して、"Good Bye"
ルールのアクティベーションをトリガーします。最後に、"Good Bye"
ルールが実行します。Audit View でイベントが選択されると、この例の "Activation created"
イベントである元のイベントが緑色にハイライトされます。
図9.3 Hello World の例の監査ビュー