JBoss Rulesサンプルプログラム2

計算を行うサンプルプログラム

次に、JBoss Rules を用いた簡単な計算を行うサンプルプログラムを作成します。

このような単純な計算のみをルールベースで行うことは実用上あまりありませんが、ルールベースのプログラミングの特徴をあらわすサンプルとしていくつかをあげてみましょう。

(1) 1から100までを足すプログラム 

まず、数を表すクラスNumberFactを作りましょう。これは、Javaのクラスであると同時に、ワーキングメモリ上のファクトにも対応します。

NumberFact.java

package com.sample;

public class NumberFact {
    private String name;
    private int number;

    public NumberFact(String name, int number) {
        super();
        this.name = name;
        this.number = number;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    //数を加える
    public void add(NumberFact numFact) {
        this.number = this.number + numFact.getNumber();
    }

    //1を足す
    public void add1() {
        this.number = this.number + 1;
    }

}

次に、メインプログラムは、以下のとおりです。

DroolsTest.java

package com.sample;


import java.io.InputStreamReader;
import java.io.Reader;

import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.WorkingMemory;
import org.drools.compiler.PackageBuilder;
import org.drools.rule.Package;

/**
 * This is a sample file to launch a rule package from a rule source file.
 */
public class DroolsTest {

    public static final void main(String[] args) {
        try {
           
            //load up the rulebase
            RuleBase ruleBase = readRule();
            WorkingMemory workingMemory = ruleBase.newWorkingMemory();
           

            //カウンタの初期設定
            NumberFact numFact1 = new NumberFact(“counter”,1);
            workingMemory.assertObject( numFact1 );
            //和
            NumberFact numFact2 = new NumberFact(“sum”,0);
            workingMemory.assertObject( numFact2 );
           // ~まで
           NumberFact numFact3 = new NumberFact(“limit”,100);
           workingMemory.assertObject( numFact3 );
      
     workingMemory.fireAllRules();

         } catch (Throwable t) {
            t.printStackTrace();
        }
    }

  /**     * Please note that this is the “low level” rule assembly API.     */

private static RuleBase readRule() throws Exception {
        Reader source = new InputStreamReader(
                                    DroolsTest.class.getResourceAsStream( “/Sample.drl” ) );
        PackageBuilder builder = new PackageBuilder();
        builder.addPackageFromDrl( source );
        Package pkg = builder.getPackage();
        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
        ruleBase.addPackage( pkg );
        return ruleBase;
    }

}

1から100までを数えるカウンター(counter)というファクトと、足し算の結果を保持するファクト、足し算の最後の数を表すリミット(Limit)を最初に登録(assert)して、その後ルールを走らせます。

ルールファイルであるsample.drlは以下のとおりです。

sample.drl

package com.sample

import com.sample.NumberFact;

rule “count1”
  when
    counter: NumberFact( name == “counter”,num : number)
    sumFact:  NumberFact( name == “sum”, sum : number)
  then
    sumFact.add(counter);
    modify( sumFact );
    counter.add1();
    modify(counter);
end

rule “watch”
  when
    NumberFact( name == “limit”, lim : number )
    counter: NumberFact( name == “counter”,num : number > lim )
    NumberFact( name == “sum”, sum : number)
  then
    System.out.println(“sum of 1..”+lim+” = “+sum);
    retract(counter);
end

 これを実行すると

 sum of 1..100 = 5050

という結果が表示されます。