Drools 是一款基於Java 的開源規則引擎,所以在使用Drools 之前需要在開發機器上安裝好JDK 環境,Drools5 要求的JDK 版本要在1.5 或以上。
Drools5 提供了一個基於Eclipse3.4 的一個IDE 開發工具,所以在使用之前需要到http://eclipse.org 網站下載一個3.4.x 版本的Eclipse , 下載完成之后, 再到
http://jboss.org/drools/downloads.html 網站,下載Drools5 的Eclipse 插件版IDE 及Drools5的開發工具包,如圖1-1 所示。

將下載的開發工具包及IDE 包解壓到一個非中文目錄下,解壓完成后就可以在Eclipse3.4 上安裝Drools5 提供的開發工具IDE 了。
打開Eclipse3.4 所在目錄下的links 目錄(如果該目錄不存在可以手工在其目錄下創建一個links 目錄),在links 目錄下創建一個文本文件,並改名為drools5-ide.link,用記事本打開該文件,按照下面的版本輸入Drools5 Eclipse Plugin 文件所在目錄:path=D:\\eclipse\\drools-5.0-eclipse-all這個值表示Drools5 Eclipse Plugin 文件位於D 盤eclipse 目錄下的drools-5.0-eclipse-all下面,這里有一點需要注意,那就是drools-5.0-eclipse-all 文件夾下必須再包含一個eclipse目錄,所有的插件文件都應該位於該eclipse 目錄之下,接下來要在win dos 下重啟Eclipse 3.4,檢驗Drools5 IDE 是否安裝成功。進入win dos,進入Eclipes3.4 所在目錄,輸入eclipse –clean 啟動Eclipse3.4。啟動完成后打開菜單WindowPreferences,在彈出的窗口當中如果能在左邊導航樹中發現Drools 節點就表示Drools5 IDE 安裝成功了,如圖1-2 所示。

IDE 安裝完成后,接下來需要對Drools5 的IDE 環境進行簡單的配置,打開菜單WindowPreferences,在彈出的窗口當中選擇左邊導航樹菜單DroolsInstalled Drools
Runtimes 設置Drools5 IDE 運行時依賴的開發工具包,點擊“Add…”按鈕添加一個開發工具包,如圖1-3 所示。

圖 1-3 當中添加了一個開發工具包,名稱為“drools-5.0.0”,對應的工具包目錄為D 盤doc\about rule\drools5.x\drools-5.0-bin 目錄。添加完成后這樣Drools5 的開發環境就搭好了。
下面我們就來利用這個環境編寫一個規則看看運行效果。
編寫第一個規則
環境搭建好后,新建一個Drools Project項目,為項目取好名字后直接finish。
項目結構如圖1-4

我們打開DroolsTest.java看看
1 package com.sample; 2 3 import org.drools.KnowledgeBase; 4 import org.drools.KnowledgeBaseFactory; 5 import org.drools.builder.KnowledgeBuilder; 6 import org.drools.builder.KnowledgeBuilderError; 7 import org.drools.builder.KnowledgeBuilderErrors; 8 import org.drools.builder.KnowledgeBuilderFactory; 9 import org.drools.builder.ResourceType; 10 import org.drools.io.ResourceFactory; 11 import org.drools.logger.KnowledgeRuntimeLogger; 12 import org.drools.logger.KnowledgeRuntimeLoggerFactory; 13 import org.drools.runtime.StatefulKnowledgeSession; 14 15 /** 16 * This is a sample class to launch a rule. 17 */ 18 public class DroolsTest { 19 20 public static final void main(String[] args) { 21 try { 22 // load up the knowledge base 23 KnowledgeBase kbase = readKnowledgeBase(); 24 StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); 25 KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test"); 26 // go ! 27 Message message = new Message(); 28 message.setMessage("Hello World"); 29 message.setStatus(Message.HELLO); 30 ksession.insert(message); 31 ksession.fireAllRules(); 32 logger.close(); 33 } catch (Throwable t) { 34 t.printStackTrace(); 35 } 36 } 37 38 private static KnowledgeBase readKnowledgeBase() throws Exception { 39 KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 40 kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), ResourceType.DRL); 41 KnowledgeBuilderErrors errors = kbuilder.getErrors(); 42 if (errors.size() > 0) { 43 for (KnowledgeBuilderError error: errors) { 44 System.err.println(error); 45 } 46 throw new IllegalArgumentException("Could not parse knowledge."); 47 } 48 KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); 49 kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); 50 return kbase; 51 } 52 53 public static class Message { 54 55 public static final int HELLO = 0; 56 public static final int GOODBYE = 1; 57 58 private String message; 59 60 private int status; 61 62 public String getMessage() { 63 return this.message; 64 } 65 66 public void setMessage(String message) { 67 this.message = message; 68 } 69 70 public int getStatus() { 71 return this.status; 72 } 73 74 public void setStatus(int status) { 75 this.status = status; 76 } 77 78 } 79 80 }
KnowledgeBase:Drools 提供的用來收集應用當中知識(knowledge)定義的知識庫對象,通過KnowledgeBaseFactory 對象提供的newKnowledgeBase()方法來實現
KnowledgeBuilder:用來在業務代碼當中收集已經編寫好的規則, 然后對這些規則文件進行編譯, 最終產生一批編譯好的規則包(KnowledgePackage)給其它的應用程序使用,KnowledgeBuilder 在編譯規則的時候可以通過其提供的hasErrors()方法得到編譯規則過程中發現規則是否有錯誤
StatefulKnowledgeSession:插入業務對象,觸發規則執行或開始一個規則流執行。
KnowledgeRuntimeLogger:規則運行日志
DroolsTest.java首先通過readKnowledgeBase()方法獲取KnowledgeBase,在readKnowledgeBase()里面載入規則文件,然后在StatefulKnowledgeSession里面放入了一個Message對象,然后調用fireAllRules()開始執行規則。
DroolsTest里面還定義了一個Message對象,Message有兩個屬性message和status,兩個常量:HELLO和GOODBYE
我們再看看規則文件Sample.drl
1 package com.sample 2 3 import com.sample.DroolsTest.Message; 4 5 rule "Hello World" 6 when 7 m : Message( status == Message.HELLO, myMessage : message ) 8 then 9 System.out.println( myMessage ); 10 m.setMessage( "Goodbye cruel world" ); 11 m.setStatus( Message.GOODBYE ); 12 update( m ); 13 end 14 15 rule "GoodBye" 16 when 17 Message( status == Message.GOODBYE, myMessage : message ) 18 then 19 System.out.println( myMessage ); 20 end
rule "Hello World","Hello World"值規則的名稱,Rule非常像java里面的一個if...else....
rule "Hello World"描述的邏輯大概為:insert進來的對象如果是一個Message對象,並且Message的status屬性等於Message.HELLO,那么將Message的message屬性賦值給myMessage,最后將Message對象賦予給m。在then部分打印了myMessage,然后將新的Message對象m的message和status進行修改."Hello World"執行完畢,此時應該在控制台打印輸出:Hello World。接下來執行rule "GoodBye".
rule "GoodBye"描述的邏輯為:判斷對象是否為一個Message對象,並且Message的status屬性等於Message.GOODBYE,將Message的message屬性賦值給myMessage,然后在控制台打印myMessage,控制台應該輸出:Goodbye cruel world。
好了,我們在DroolsTest.java中運行看看是不是和我們預計的一樣.運行方式選擇Java運行程序
可以看到控制台輸出:
Hello World
Goodbye cruel world
