天天看點

Drools規則引擎初學入門執行個體HelloWorld

2009-01-14 11:32(1)下載下傳eclipse(www.eclipse.org),如果是一般的java開發,下載下傳Eclipse IDE for Java Developers就行了,解壓後即可使用;

(2)下載下傳Drools(http://jboss.org/drools/downloads.html),目前最新版本是Drools 4.0.7 Binaries,下載下傳後解壓即可;

(3)之後下載下傳eclipse的Drools插件,版本跟eclipse對應,目前有Drools 4.0.7 Eclipse 3.2 Workbench和Drools 4.0.7 Eclipse Europa 3.3 Workbench兩種。

Drools插件解壓後,将裡面的org.drools.eclipse_4.0.7.jar檔案copy到eclipse的plugins目錄中,重新開機eclipse,在工具欄可以看到一個 圖示,這就是Drools的工作台,之後就可通過這個按鈕建立Drools resource檔案了。

(4)開始Hello World

Java檔案: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;

public class DroolsTest {

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

try {

//load up the rulebase

RuleBase ruleBase = readRule();

WorkingMemory workingMemory = ruleBase.newStatefulSession();

//go !

Message message = new Message();

message.setMessage( "Hello World" );

message.setStatus( Message.HELLO );

workingMemory.insert( message );

workingMemory.fireAllRules();

} catch (Throwable t) {

t.printStackTrace();

}

}

private static RuleBase readRule() throws Exception {

//read in the source

Reader source = new InputStreamReader( DroolsTest.class.getResourceAsStream( "/Sample.drl" ) );

//optionally read in the DSL (if you are using it).

//Reader dsl = new InputStreamReader( DroolsTest.class.getResourceAsStream( "/mylang.dsl" ) );

//Use package builder to build up a rule package.

//An alternative lower level class called "DrlParser" can also be used...

PackageBuilder builder = new PackageBuilder();

//this wil parse and compile in one step

//NOTE: There are 2 methods here, the one argument one is for normal DRL.

builder.addPackageFromDrl( source );

//Use the following instead of above if you are using a DSL:

//builder.addPackageFromDrl( source, dsl );

//get the compiled package (which is serializable)

Package pkg = builder.getPackage();

//add the package to a rulebase (deploy the rule package).

RuleBase ruleBase = RuleBaseFactory.newRuleBase();

ruleBase.addPackage( pkg );

return ruleBase;

}

public static class Message {

public static final int HELLO = 0;

public static final int GOODBYE = 1;

public static final int GAME_OVER = 2;

private String message;

private int status;

public String getMessage() {

return this.message;

}

public void setMessage(String message) {

this.message = message;

}

public int getStatus() {

return this.status;

}

public void setStatus( int status ) {

this.status = status;

}

}

}

選擇插件Drools按鈕裡的"New Rule resource",建立規則(rule)檔案:Sample.drl

package com.sample

import com.sample.DroolsTest.Message;

rule "Hello World"

when

m : Message( status == Message.HELLO, message : message )

then

System.out.println( message );

m.setMessage( "Goodbye cruel world" );

m.setStatus( Message.GOODBYE );

update( m );

end

rule "GoodBye"

no-loop true

when

m : Message( status == Message.GOODBYE, message : message )

then

System.out.println( message );

m.setStatus(Message.GAME_OVER);

m.setMessage("game over now!");

update( m );

end

rule "game over"

when

m : Message( status == Message.GAME_OVER)

then

System.out.println( m.getMessage() );

end

注意:檔案要放在相應的包裡,然後編譯—執行,當時出現了錯誤,查找資料,還需要加載包,包括:

<1> Drools 4.0.7目錄下的drools-core-4.0.7.jar,drools-compiler-4.0.7.jar

<2> Drools 4.0.7\lib目錄下的antlr-runtime-3.0.jar,mvel-1.3.1-java1.4.jar

<3>以及eclipse\plugins目錄下的org.eclipse.jdt.core_3.2.3.v_686_R32x.jar(不同版本,包名會稍有不同)。

重新運作,應該就不會有錯了。執行結果如下:

Hello World

Goodbye cruel world

game over now!