最近項目中要涉及到使用規則對數據進行操做,想到本身實現一個完整且能靈活知足業務需求的規則系統太難了,就想了解一下有沒有開源的規則引擎可使用,後來發現Drools這個開源引擎,發現其功能強大到超出個人預期。html
什麼是Drools?它是由大名鼎鼎的JBoss公司開源的規則引擎系統,能夠免費下載使用,如今已經發展到6.5版本,而且7.0RC版也已經能夠下載使用了。它能夠集成在JavaEE項目中進行使用,其下載地址以下:https://www.drools.org/download/download.html,進入下載地址後下載Drools Engine和Drools and jBPM tools兩個壓縮包在Eclipse中作好相應的配置後就能夠進行開發了。java
Eclipse開發環境的搭建,將Drools and JBPM tools壓縮包解壓後將目錄\binaries\org.drools.updatesite目錄中的plagins和features兩個子目錄copy到Eclipse的各目錄下,這兩個子目錄中的內容會和Eclipse中對應的子目錄中的內容合併,而後啓動Eclipse,打開Window菜單下Preferences,會發現多了Drools項,而後對Drools進行配置,以下圖:api
再選擇Drools Runtime將Drools Engine壓縮包解壓後的jar文件填加進去,以下圖:session
點擊OK後,選擇已經填加的Runtime,以下圖:學習
作好這些配置後,重啓Eclipse。而後新建項目,會發現項目類型中多了Drools類型,選擇Drools Project,Next。測試
選擇第二項,建立示例項目。 ui
進入項目後項目結構以下: this
其中com.sample中是針對三種規則文件的測試類,resources目錄下對應三種規則定義文件,分別是Excel,drl和bpmn文件,kmodule.xml中存儲的kbase和kession的描述,描述以下: spa
<?xml version="1.0" encoding="UTF-8"?> 3d
<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規則引擎的程序就開發完畢了。