Technical Works

ASC Technical support site

*

Drools(Java Rules Engine)の紹介

      2015/01/05

ルール・エンジンとは

ルール・エンジンとは、ビジネス上のルールといった「分岐処理(IF文処理)」を処理するための専用のエンジンのことです。ルール・エンジンとは、ビジネスルールとアプリケーションを切り離す役割を担い、これにより、アプリケーションを変更せずに、ビジネスルールのみを変更できます。ビジネスルールを個別に扱うことで、複雑な条件分岐のロジックを組み合わせるため、結果としてアプリケーションを柔軟に扱えます。

ルール・エンジンの長所、短所

長所

①ビジネスルールの更新をアプリケーション・プログラムとは関係なしで行うことができます
②ビジネスルール構築に特化した環境・言語を利用することで開発効率が著しく向上します
③システム変更の分業が可能になります

そのため、複雑な条件判断が組み合わさっている場合とか、仕様が頻繁に変わるような問題に対しては、ルールベース・システムが適しているといえます。 他に、顧客の属性に応じて、顧客に適した商品を薦めるといったレコメンデーションシステムなどは、確かにルールベースのしくみに合っているといえます。

短所

①ルール・エンジンの動作オーバーヘッドがあります
②ルール・エンジン独自言語やGUIを習得する必要があります

そのため、適用するルールが簡単な場合とかIF/THENで表現し難い場合とか1回生成したらルールが変わらない物などには適用しないほうが良いです。

JBoss Drools

Droolsとは

Droolsはオープンソースのルール・エンジンです。その中心部にあるのが推論・エンジンです。推論・エンジンの役割は事実(Fact)とルール(Rule)をパターンマッチを利用し分析を行い、条件(Condition)が真(True)のものを実行(Action)します。パターンマッチ作業は拡張されたReteアルゴリズムによって行われます。Reteアルゴリズムは、事実とルールのパターンマッチ機能の実装を論理的に一般化したもです。Reteアルゴリズムは以下のような特徴を持っています。

①ノード共有によってある程度の冗長性を排除する。
②異なる型の事実群の結合について、部分的なマッチングを保持する。
③ワーキングメモリ上からある事実が排除された場合、関連するメモリ内容を効率的に消去できる。

ルール構成

Droolsは「Drools Rule Language(DRL)」を使います。DRLファイルはパッケージ名、複数のルール、クエリ、型、関数、およびリソース宣言を指定する単純なテキストファイルです。
ルールは “いつ” 条件の特定セットが発生するのかを指定し、それは左側(LHS)に 指定されます。そしてこの条件を実行するアクションの一覧が右側(RHS)に一覧 されています。エンジンの寿命期間内の如何なる時点でも それが発生する “時に” ルールを実行します。ルールは名前を持つ必要があります。そしてそのルールパッケージの為に独自の 名前でなければなりません。同じ DRL 内でルールを2回定義した場合は、ロード中に エラーを出します。パッケージ内にすでに含まれている名前を持つ DRL を追加した 場合は、以前のルールを入れ替えます。ルール名が空白を持つことになる場合、その 名前は二重引用句で囲む必要があります。ルールの 左側 は “when” キーワードに従います。 同様に 右側 は “then” キーワードに従います。ルールは キーワード “end” で終了されます。ルールはもちろんネスト化することは出来ません。

rule "<name>"
    <attribute>*
when
    <conditional element>*
then
    <action>*
end

 Download

以下のサイトから最新版のダウンロードができます。

ダウンロード:http://www.drools.org/

drools download

上記の画面から「download」を押下し、最新バージョンが表示される画面で、DroolsのDownloadリンクを押下して最新版をダウンロードします。ちなみに、6.1の最新版の場合、ファイル名が「drools-distribution-6.1.0.Final.zip」になります。

drools download

ダウンロードした、zipで圧縮されたファイルを解凍します。その中の「binaries」配下に含まれているJarを以下のサンプルソースで利用します。

サンプルソース

以下のソースはルール・エンジンを使って、簡単にHelloメッセージを標準出力するプログラムです。まず、DRLファイルです。2つのルールを持っています。1個目がメッセージタイプがHELLOの場合、メッセージに含まれているメッセージを出力します。また、メッセージタイプを GOODBYEに変更します。次のルールはメッセージがGOODBYEの場合、Goodbyeメッセージを表示するルールとなっています。

package test
 
import test.TestExample.Message;

global java.util.List list
 
rule "Hello"
    dialect "mvel"
    when
        m : Message( status == Message.HELLO, message : message )
    then
        System.out.println( message );
        modify ( m ) { message = "Goodbye world", status = Message.GOODBYE };
end

rule "Bye"
    dialect "java"
    when
        Message( status == Message.GOODBYE, message : message )
    then
        System.out.println( message );
end

次は、ソースコードです。ソース上では、KieSessionを使用して、Messageクラスにメッセージ(Hello World)を設定、ルール実行を行っています。

package test;

import java.util.ArrayList;
import java.util.List;

import org.kie.api.KieServices;
import org.kie.api.event.rule.DebugAgendaEventListener;
import org.kie.api.event.rule.DebugRuleRuntimeEventListener;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

public class TestExample {

    public static final void main(final String[] args) {

        KieContainer kc = KieServices.Factory.get().getKieClasspathContainer();
        KieSession ksession = kc.newKieSession("TestKS");

        ksession.setGlobal( "list", new ArrayList<Object>() );

        final Message message = new Message();
        message.setMessage( "Hello World" );
        message.setStatus( Message.HELLO );
        ksession.insert( message );

        ksession.fireAllRules();

        ksession.dispose();
    }

    public static class Message {

        public static final int HELLO   = 0;
        public static final int GOODBYE = 1;

        private String message;

        private int status;

        public Message() {
        }

        public String getMessage() {
            return this.message;
        }

        public void setMessage(final String message) {
            this.message = message;
        }

        public int getStatus() {
            return this.status;
        }

        public void setStatus(final int status) {
            this.status = status;
        }
    }

}

最後に、「kmodule.xml」ファイルが必要になります。META-INFディレクトリ配下に作成します。このファイルは、Ksessionを定義するファイルとなっております。

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://jboss.org/kie/6.0.0/kmodule">

    <kbase name="TestKB" packages="test">
        <ksession name="TestKS"/>
    </kbase>

</kmodule>

以下にJavaプログラムを実行した結果を示します。

drools execute

 まず、Javaソースのコンパイルは以下のコマンドを実行します。

コンパイル:C:\Dev\Java\jdk1.7.0_72\bin\javac.exe -cp .;lib\* test\TestExample.java

次に、実行する時は以下になります。

実行:C:\Dev\Java\jdk1.7.0_72\bin\java.exe -cp .;lib\* test.TestExample

The following two tabs change content below.

最新記事 by 李 (全て見る)

 - Java, JBoss

Loading Facebook Comments ...

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


*

  関連記事

Infinispanの応用

今回はInfinispanを利用した応用編となります。 今回紹介する機能は以下の …

Infinispanの紹介

はじめに Infinispanはオープンソースデータグリッドプラットフォームで、 …

Jbossを利用したWebアプリケーションローカル環境構築手順(1/3)

Webアプリケーションの、ちょっとした動作確認や 自由に利用できる自分専用のデー …

eclipse tips

今回は開発に役に立つ便利なeclipseのショートカットキーを紹介したいと思いま …

Active MQ紹介

1.Message Queueとは まず、メッセージとはアプリケーションにとって …