Drools 6.5 Final 入門,droolsfinal

來源:互聯網
上載者:User

Drools 6.5 Final 入門,droolsfinal
Drools 6.5 Final學習筆記

最近項目中要涉及到使用規則對資料進行操作,想到自己實現一個完整且能靈活滿足業務需求的規則系統太難了,就想瞭解一下有沒有開源的規則引擎可以使用,後來發現Drools這個開源引擎,發現其功能強大到超出我的預期。

什麼是Drools?它是由大名鼎鼎的JBoss公司開源的規則引擎系統,可以免費下載使用,現在已經發展到6.5版本,並且7.0RC版也已經可以下載使用了。它可以整合在JavaEE項目中進行使用,其如下:https://www.drools.org/download/download.html,進入後下載Drools Engine和Drools and jBPM tools連個壓縮包在Eclipse中做好相應的配置後就可以進行開發了。

Eclipse開發環境的搭建,將Drools and JBPM tools壓縮包解壓後將目錄\binaries\org.drools.updatesite目錄中的plagins和features兩個子目錄copy到Eclipse的各目錄下,這兩個子目錄中的內容會和Eclipse中對應的子目錄中的內容合并,然後啟動Eclipse,開啟Window菜單下Preferences,會發現多了Drools項,然後對Drools進行配置,如:

再選擇Drools Runtime將Drools Engine壓縮包解壓後的jar檔案填加進去,如:

點擊OK後,選擇已經填加的Runtime,如:

做好這些配置後,重啟Eclipse。然後建立項目,會發現項目類型中多了Drools類型,選擇Drools Project,Next。

選擇第二項,建立樣本項目。

進入項目後項目結構如下:

其中com.sample中是針對三種規則檔案的測試類別,resources目錄下對應三種規則定義檔案,分別是Excel,drl和bpmn檔案,kmodule.xml中儲存的kbase和kession的描述,描述如下:

<?xml version="1.0" encoding="UTF-8"?>

<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">

<kbase name="rules" packages="rules">

<ksession name="ksession-rules"/>

</kbase>

<kbase name="dtables" packages="dtables">

<ksession name="ksession-dtables"/>

</kbase>

<kbase name="process" packages="process">

<ksession name="ksession-process"/>

</kbase>

</kmodule>

其中kbase的packages必須和項目中的報名一致,ksession的名字會在代碼中用到,我們以drl規則檔案為例看一下其怎麼發揮作用的,drl規則檔案對應的測試代碼為DroolsTest,其規則檔案定義如下:

package com.sample

 

import com.sample.Message;

 

rule "Hello World"

when

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

then

System.out.println( myMessage );

m.setMessage( "Goodbye cruel world" );

m.setStatus( Message.GOODBYE );

update( m );

end

 

rule "GoodBye"

when

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

then

System.out.println( myMessage );

end

其中package為自已定義的一段文字可以與代碼中的不同,使用import引入需要進行規則驗證的物件類型,Eclipse產生的程式碼是一個static類,其實可以是一個普通類,這裡我們使用的物件類型為com.sample.Message,其中定義了兩條規則分別為Hello World和GoodBye,其使用when 和then作為if then的表達(即如果怎樣就怎樣),其中rule "Hello World"中,在when短語中定義了一個Message對象m和擷取Message屬性message的myMessage變數,then語句總使用Message類中的方法對m對象的屬性進行了更新,並使用update(m)的方式更新回了Java代碼中,整個when的意思是對傳入的Message對象m進行如下判斷如果m.status==Message.HELLO,則執行then中的操作。

DroolsTest.java代碼如下,main方法中前三行則是為了構造Kie對象,取得了kmodule.xml中名字為ksession-rules的session,通過kSession.insert(msg)傳入需要進行規則驗證的對象,通過kSession.fireAllRules()執行規則。

package com.sample;

 

import java.util.ArrayList;

import java.util.List;

 

import org.kie.api.KieServices;

import org.kie.api.runtime.KieContainer;

import org.kie.api.runtime.KieSession;

 

public class DroolsTest {

 

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

try {

// load up the knowledge base

     KieServices ks = KieServices.Factory.get();

     KieContainer kContainer = ks.getKieClasspathContainer();

KieSession kSession = kContainer.newKieSession("ksession-rules");

// go !

Message message = new Message();

message.setMessage("Hello World");

message.setStatus(Message.HELLO);

System.out.println(String.format("執行規則前message對象的變化如下:message.message=%s,message.status=%d", message.getMessage(),message.getStatus()));

Message message2=new Message();

message2.setMessage("liuyinghui");

message2.setStatus(Message.HELLO);

List<Message> listMsg= new ArrayList<Message>();

listMsg.add(message2);

listMsg.add(message);

for (Message msg : listMsg) {

     kSession.insert(msg);

kSession.fireAllRules();

            }

System.out.println(String.format("執行規則後message對象的變化如下:message.message=%s,message.status=%d", message.getMessage(),message.getStatus()));

 

} catch (Throwable t) {

t.printStackTrace();

}

}

}

Message.java的定義如下:

package com.sample;

 

public class Message {

 

public static final int HELLO = 0;

public static final int GOODBYE = 1;

 

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;

}

 

}

 

運行結果如,可以看到經過規則引擎的處理前後後message對象的變化,中間測試規則檔案執行時輸出的一些屬性值,至此一個簡單的使用Drools規則引擎的程式就開發完畢了。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.