Drools規則引擎環境搭建


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 }
View Code

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM