Drools規則引擎初學入門實例HelloWorld

Drools規則引擎初學入門實例HelloWorld

   來自網絡,不保證正確性



EclipseJBossUPIDEGo
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;

/**
* 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.newStatefulSession();
           
            //go !
             Message message = new Message();
             message.setMessage(  "Hello World" );
             message.setStatus( Message.HELLO );
             workingMemory.insert( message );
             workingMemory.fireAllRules();  
           
           
         } catch (Throwable t) {
             t.printStackTrace();
         }
     }

    /**
      * Please note that this is the "low level" rule assembly API.
      */
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!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章