drools初接觸

來源:互聯網
上載者:User

 Drool是jboss的規則引擎, 老早就想看看了, 前斷時間忙的一直沒有時間.現在抽空學習一下.記錄一下學習的心得體會, 也算給今年一個交代.
 

一. 環境配置.
最快的方法:
下載Drool的eclipse外掛程式:
http://www.jboss.org/drools/downloads.html
 

此外掛程式功能不錯, 寫rule很方便, 並且能建立 drool project, 所有依賴
的jar包都有包含,

 二: hello world
晦澀的理論先放一邊, 跑一個hello world再說:

 

  1. package com.sample;
  2. import java.io.InputStreamReader;
  3. import java.io.Reader;
  4. import org.drools.RuleBase;
  5. import org.drools.RuleBaseFactory;
  6. import org.drools.WorkingMemory;
  7. import org.drools.compiler.PackageBuilder;
  8. import org.drools.rule.Package;
  9. /**
  10.  * This is a sample file to launch a rule package from a rule source file.
  11.  */
  12. public class DroolsTest {
  13.     public static final void main(String[] args) {
  14.         try {
  15.          
  16.          //load up the rulebase
  17.             RuleBase ruleBase = readRule();
  18.             WorkingMemory workingMemory = ruleBase.newStatefulSession();
  19.             
  20.             //go !
  21.             Message message = new Message();
  22.             message.setMessage(  "Hello World" );
  23.             message.setStatus( Message.HELLO );
  24.             workingMemory.insert( message );
  25.             workingMemory.fireAllRules();   
  26.             
  27.             
  28.         } catch (Throwable t) {
  29.             t.printStackTrace();
  30.         }
  31.     }
  32.     /**
  33.      * Please note that this is the "low level" rule assembly API.
  34.      */
  35.  private static RuleBase readRule() throws Exception {
  36.   //read in the source
  37.   Reader source = new InputStreamReader( DroolsTest.class.getResourceAsStream( "/Sample.drl" ) );
  38.   
  39.   //optionally read in the DSL (if you are using it).
  40.   //Reader dsl = new InputStreamReader( DroolsTest.class.getResourceAsStream( "/mylang.dsl" ) );
  41.   //Use package builder to build up a rule package.
  42.   //An alternative lower level class called "DrlParser" can also be used...
  43.   
  44.   PackageBuilder builder = new PackageBuilder();
  45.   //this wil parse and compile in one step
  46.   //NOTE: There are 2 methods here, the one argument one is for normal DRL.
  47.   builder.addPackageFromDrl( source );
  48.   //Use the following instead of above if you are using a DSL:
  49.   //builder.addPackageFromDrl( source, dsl );
  50.   
  51.   //get the compiled package (which is serializable)
  52.   Package pkg = builder.getPackage();
  53.   
  54.   //add the package to a rulebase (deploy the rule package).
  55.   RuleBase ruleBase = RuleBaseFactory.newRuleBase();
  56.   ruleBase.addPackage( pkg );
  57.   return ruleBase;
  58.  }
  59.  public static class Message {
  60.   public static final int HELLO = 0;
  61.   public static final int GOODBYE = 1;
  62.   public static final int GAME_OVER = 2;
  63.   
  64.   private String message;
  65.   
  66.   private int status;
  67.   
  68.   public String getMessage() {
  69.    return this.message;
  70.   }
  71.   
  72.   public void setMessage(String message) {
  73.    this.message = message;
  74.   }
  75.   
  76.   public int getStatus() {
  77.    return this.status;
  78.   }
  79.   
  80.   public void setStatus( int status ) {
  81.    this.status = status;
  82.   }
  83.  }
  84.     
  85. }

rule檔案:
   Sample.drl

  1. package com.sample
  2. import com.sample.DroolsTest.Message;
  3. rule "Hello World"
  4.  when
  5.   m : Message( status == Message.HELLO, message : message )
  6.  then
  7.   System.out.println( message ); 
  8.   m.setMessage( "Goodbye cruel world" );
  9.   m.setStatus( Message.GOODBYE );
  10.   update( m );
  11. end
  12. rule "GoodBye"
  13.  no-loop true
  14.  when
  15.   m : Message( status == Message.GOODBYE, message : message )
  16.  then
  17.   System.out.println( message ); 
  18.   m.setStatus(Message.GAME_OVER);
  19.   m.setMessage("game over now!"); 
  20.   update( m ); 
  21. end
  22. rule "game over"
  23.  when
  24.   m : Message( status == Message.GAME_OVER)
  25.  then
  26.   System.out.println( m.getMessage() );   
  27. end
  28. java代碼就不說了, 簡單解釋一下rule檔案:
  29. rule "Hello World"
  30.  when
  31.   m : Message( status == Message.HELLO, message : message )
  32.  then
  33.   System.out.println( message ); 
  34.   m.setMessage( "Goodbye cruel world" );
  35.   m.setStatus( Message.GOODBYE );
  36.   update( m );
  37. end

java代碼就不說了, 主要說明一下rule檔案, 熟悉一下rule文法:
1:規則的主體結構:
rule "name"
    ATTRIBUTES
    when
        LHS
    then
        RHS
end

其中:
LHS(left hand side)是規則的條件部分, RHS(right hand side)是條件滿足後的自行塊.

2: 條件的書寫:
m : Message( status == Message.HELLO, message : message )
意思是:
在working Memory中, 如果有一個Message的instance滿足如下條件:
它的status熟悉等於Message.HELLO.
滿足條件的Message instance 用變數 m表示, 它的message屬性用message變數表示, 以便在RHS中使用.
 
3: 條件滿足後的自行塊(RHS)
 
   System.out.println( message );
  m.setMessage( "Goodbye cruel world" );
  m.setStatus( Message.GOODBYE );
  update( m );
用到了在LHS中 定義的變數: m, message
update( m )表示把此Message instance在 working memory中更新.這便會觸發名稱為"GoodBye"的rule, 進而觸發名稱為"game over"的rule.

 

以下是drools提供的demo, 稍微整理了下, 可直接在eclipse中import進來

http://lcllcl987.javaeye.com/blog/255404
(前提: 下載並安裝Drool的eclipse外掛程式:Drools 4.0.7 Eclipse Workbench for 3.2 )
建議首先看看:
FibonacciExample: Fibonacci數列的drools實現.
GolfingExample: 著名的golf智力問題的drools實現,golf.drl的注釋就是此問題的文字描述.
ShoppingExample: 一個shopping打折的demo, 超過100元, 有10元的折扣.
StateExampleUsingAgendGroup: By setting dynamic to TRUE, Drools will use JavaBean, PropertyChangeListeners so you don't have to call update().
StateExampleWithDynamicRules: 動態載入rule的一個demo(載入StateExampleUsingSalience.drl後在載入StateExampleDynamicRule.drl).

TroubleTicketExample:
使用了duration規則特性: 將指定的規則延遲一定時間運行
規則引擎是在另外一個線程中進行的,因此使用了duration特性可以將指定的規則延遲一定時間運行.
但是要注意的是主線程中也需要做相應的延時,否則主線程結束後不會再處理子線程的結果
salience 和 duration特性影響rule的執行順序.
其次demo還定義了一個rule function.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.