jboss規則引擎

前言


目前世面上中文的KIE DROOLS Workbench(JBOSS BRMS)的教程幾乎沒有,有的也只有靈靈碎碎的使用機器來翻譯的(翻的不知所云)或者是基於老版本的JBOSS Guvnor即5.x的一些教程,而且這些教程都是”缺胳膊少腿“的,初學者看後不知道它到底在幹嗎?能幹嗎?能夠解決自己系統中什麼問題。

所以筆者自己寫了幾個例子,把整個最新的英文版的KIE DROOLS 6.3.0.Final的官方教程給串了起來,用於供讀者使用並以此來作爲入門以及相關SOA理念的推廣的第一步。

本教程共分爲”三“集。


什麼是規則引擎





規則是讓業務人士驅動整個企業過程的最佳實踐






業務規則在實現上的矛盾



業務規則技術



引入業務規則技術的目的

對系統的使用人員

  • 把業務策略(規則)的創建、修改和維護的權利交給業務經理
  • 提高業務靈活性
  • 加強業務處理的透明度,業務規則可以被管理
  • 減少對IT人員的依賴程度
  • 避免將來升級的風險
對IT開發人員
  • 簡化系統架構,優化應用
  • 提高系統的可維護性和維護成本
  • 方便系統的整合
  • 減少編寫“硬代碼”業務規則的成本和風險

何爲規則引擎

  • 可以將一個或多個的事實映射到一個或多個規則上
  • 接受數據輸入,解釋業務規則,並根據業務規則做出業務決策

一個簡單的例子



從IT技術人員的角度看爲什麼使用規則引擎?

  • 從應用邏輯和數據中將業務邏輯分離
  • 簡單! -規則有一個非常簡單的結構
  • 讓業務用戶開發和維護規則以降低成本
  • 聲明式編程
  • 性能和可伸縮性
  • 解決複雜的和複合的問題,其中有大量細粒度的規則和事實互動


DEMO-人壽新卓越變額萬能壽險投保規則



DEMO-人壽新卓越變額萬能壽險投保規則的IT實現


免體檢累積最高限額表在規則引擎中的實現:



什麼叫BRMS


什麼是BRMS-考慮兩個問題(IT管理者角度)




什麼是BRMS-考慮兩個問題(開發人員易用性角度)




BRMS-Business Rules Management System



一個優秀的BRMS應該具有的特點



BRMS中兩個重要的概念:因子、公式




從業務的角度看因子與公式間的關係


從IT的角度看因子與公式間的關係



基於BRMS的系統邏輯架構


這個邏輯圖有點複雜,很多人看了都會感覺“不知所云”,OK,不急!我們在後文中會來“回溯”它。




JBOSS Drools & Guvnor


世面上成熟的規則引擎有很多,著名的如:IBM 的iLog,pegga rulz(飛馬),我們在這邊要介紹的也是開源中最著名的jboss rulz。

Jboss Rulz最早是隻有基於.drools的規則文件的一個內嵌式規則引擎,後來它發展成了“規則管理系統”即BRMS,它的BRMS被稱爲Guvnor。後來在JBOSS Guvnor5.x後它又改名叫"KIE Drools WorkBench“。





目前世面上中文的KIE DROOLS Workbench(JBOSS BRMS)的教程幾乎沒有,有的也只有靈靈碎碎的使用機器來翻譯的(翻的不知所云)或者是基於老闆的JBOSS Guvnor即5.x的一些教程,而且這些教程都是”缺胳膊少腿“的,初學者看後不知道它到底在幹嗎?能幹嗎?能夠解決自己系統中什麼問題。

所以筆者自己寫了幾個例子,把整個最新的英文版的KIE DROOLS 6.3.0.Final給串了起來,用於供讀者使用並以此來作爲入門SOA理念的推廣的第一步。


Guvnor核心功能-最好的開源規則引擎




KIE Drools6.3.0.Final的安裝與使用


準備安裝文件與環境-環境


  •  CentOS 6
  •  mysql5.5.x or above
  •  apache-tomcat-7.0.67.zip(Tomcat7.0.4 or above)


這些環境,讀者應該自己會安裝了。


準備安裝文件與環境-必須軟件



  • kie-drools-wb-6.3.0.Final-tomcat7.war
  • drools-distribution-6.3.0.Final.zip
  • 給Tomcat7的lib目錄下用的jar文件,其中包括:

jboss-jacc-api_1.4_spec-1.0.3.Final.jar
kie-tomcat-integration-6.3.0.Final.jar
slf4j-log4j12-1.7.7.jar
log4j-core-2.1.jar
log4j-api-2.1.jar
log4j-slf4j-impl-2.1.jar
slf4j-api-1.7.7.jar
javax.security.jacc-api-1.5-javadoc.jar
btm-2.1.4.jar
btm-tomcat55-lifecycle-2.1.4.jar
jta-1.1.jar
數據庫驅動(mysql-connector-java-5.1.38.jar)


以上12個依賴文件如果讀者一時搜不到,不要緊我都把它們上傳在此了:droos6.3.0在tomcat佈署時的缺失包.zip


開始安裝


1. 把下列文件全部copy至tomcat的lib目錄下




2. 打開eclipse後按照Help->install new software輸入以下地址


[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. http://download.jboss.org/drools/release/6.3.0.Final/org.drools.updatesite/  



3. 把drools-distribution-6.3.0.Final.zip解壓在當前目錄



4. 把kie-drools-wb-6.3.0.Final-tomcat7.war解壓在當前目錄


並改名成kie-drools後拷貝入tomcat的webapps目錄下。


5. 修改D:\tomcat7\webapps\kie-drools\WEB-INF\classes\META-INF目錄下的persistence.xml文件




把該項目原來使用的H2Dialect改成MySQL5Dialect


[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <properties>  
  2.       <!--property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/-->  
  3.       <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>  
  4.       <property name="hibernate.max_fetch_depth" value="3"/>  
  5.       <property name="hibernate.hbm2ddl.auto" value="update"/>  
  6.       <property name="hibernate.show_sql" value="false"/>  
  7.       <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.BTMTransactionManagerLookup"/>  
  8.       <!-- BZ 841786: AS7/EAP 6/Hib 4 uses new (sequence) generators which seem to cause problems -->  
  9.       <property name="hibernate.id.new_generator_mappings" value="false"/>  
  10.  </properties>  


6. tomcatconf目錄下增加一個文件名爲:btm-config.properties的文件


使內容如下:

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. bitronix.tm.serverId=tomcat-btm-node0  
  2. bitronix.tm.journal.disk.logPart1Filename=${btm.root}/work/btm1.tlog  
  3. bitronix.tm.journal.disk.logPart2Filename=${btm.root}/work/btm2.tlog  
  4. bitronix.tm.resource.configuration=${btm.root}/conf/resources.properties  

7. 在tomcat的conf目錄下增加一個文件名爲:resources.properties的文件

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. resource.ds1.className=bitronix.tm.resource.jdbc.lrc.LrcXADataSource  
  2. resource.ds1.uniqueName=jdbc/jbpm  
  3. resource.ds1.minPoolSize=10  
  4. resource.ds1.maxPoolSize=20  
  5. resource.ds1.driverProperties.driverClassName=com.mysql.jdbc.Driver  
  6. resource.ds1.driverProperties.url=jdbc:mysql://192.168.0.101:3306/drools?useUnicode=true&characterEncoding=UTF-8  
  7. resource.ds1.driverProperties.user=kie  
  8. resource.ds1.driverProperties.password=aaaaaa  
  9. resource.ds1.allowLocalTransactions=true  

8. 在tomcat的conf目錄下修改context.xml


增加如下內容:

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <Resource name="jdbc/jbpm" auth="Container" type="javax.sql.DataSource"   
  2.             driverClassName="com.mysql.jdbc.Driver"   
  3.         url="jdbc:mysql://192.168.0.101:3306/drools?useUnicode=true&characterEncoding=UTF-8"   
  4.         username="kie"   
  5.         password="aaaaaa"   
  6.         maxActive="20"   
  7.         maxIdle="1"   
  8.       maxWait="5000" />  

9. 在tomcat的conf目錄下修改server.xml

增加如下內容:


[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <Valve className="org.kie.integration.tomcat.JACCValve" />   


記得一定要在</host>上部加入

10. 在tomcat的conf目錄下修改tomcat-users.xml


增加如下內容:


[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <user username="tomcat" password="tomcat" roles="admin,manager,manager-gui"/>  

該用戶用於訪問drools kie


11. 在mysql中建立一個schema,名爲drools


併爲該schema分配一個用戶,該用戶如果是通過遠程訪問mysql記得該用戶要建成%(或者是username@ip地址)這樣的格式,因爲drools在第一次運行時會通過JPA在相應的DB內建立39張表。




12. 修改tomcat目錄bin下的catalina.sh文件


增加如下內容

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. export CATALINA_HOME="/opt/tomcat1"  
  2. export CATALINA_OPTS="-Dbtm.root=$CATALINA_HOME \  
  3.         -Dbitronix.tm.configuration=$CATALINA_HOME/conf/btm-config.properties \  
  4.         -Djbpm.tsr.jndi.lookup=java:comp/env/TransactionSynchronizationRegistry \  
  5.     -Djava.security.auth.login.config=$CATALINA_HOME/webapps/kie-drools/WEB-INF/classes/login.config \  
  6.         -Dorg.jboss.logging.provider=jdk"  
  7. export JAVA_OPTS="-d64 -server -showversion -Xms1024m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:CICompilerCount=8 -XX:+UseCompressedOops -XX:-DontCompileHugeMethods -Xss256k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:MaxTenuringThreshold=31 -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+UseFastAccessorMethods -Djava.awt.headless=true -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseGCOverheadLimit -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:MaxGCPauseMillis=200 -Dorg.kie.demo=false"    


注意:


1. 此處我的tomcat是放在CentOS的/opt/tomcat1下的,因此我的CATALINA_HOME的設置要換成你的tomcat所在的路徑

2. 參數 –Dorg.kie.demo=false的作用是在無互聯網環境下去運行kie-drools時,如果不加此參數kie-drools會在每次運行時去GIT試圖加載kie-drools的demo,如果你的服務器爲虛擬機或者是無互聯網環境時它會因爲建立internet連接超時而拋出一個疑似memory leak的exception而導致整個war工程加載失敗。

3.  \ 這個符號的前後都要有空格,同時每行啓始處也有有空格,這個符號的作用是在LINUX的CONSOLE界面中一行太長了,分成多行寫但可以連成一行執行的作用。

啓動

在tomcat/bin目錄下鍵入: ./catalina.sh start啓動tomcat,在tomcat/logs目錄下觀察日誌文件:



打開一個IE,輸入如下地址:http://192.168.0.101:8080/kie-drools即可看到kie-drools的主界面了



KIE的使用


使用tomcat/tomcat(在tomcat-users.xml文件中配置的具有admin/analyst角色的用戶即可登錄)





新建一個Project






可以看到,在KIE-DROOLS裏的project其實就是一個maven工程

如果在新建Project時碰到讓你必須"Select a repository”,請按照下面步驟操作





在project裏新建一條規則

爲了練習,我們將新建一條規則,這條規則很簡單:


假設有一報銷流程,需要經過部門經理審批後到財務,如果員工的報銷經額大於5,000那麼除部門經理需要審批外還要報總經理再審批。


這是一條業務規則,假設哪天總經理說“大於5,000就要我批,我太煩了,改成大於10,000塊才需要我審覈吧”,想一下我們傳統的做法。



利用KIE-DROOLS書寫規則-建立因子

該規則涉及到一個公式 money>X
該規則涉及到一個因子,money


按照上述思想,我們先建立因子



這個Data Object就是因子



你可以在eclipse裏把這個POJO寫好後直接複製到KIE-DROOLS的Data Object編輯界面中去:

[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. package org.sky.threshholdrulz;  
  2.   
  3. public class PaymentInfo implements java.io.Serializable {  
  4.   
  5. static final long serialVersionUID = 1L;  
  6.   
  7. public PaymentInfo() {  
  8. }  
  9.   
  10. private int moneyAmount = 0;  
  11. private String decisionPath = "";  
  12.   
  13. public void setMoneyAmount(int amount) {  
  14. this.moneyAmount = amount;  
  15. }  
  16.   
  17. public int getMoneyAmount() {  
  18. return this.moneyAmount;  
  19. }  
  20.   
  21. public void setDecisionPath(String path) {  
  22. this.decisionPath = path;  
  23. }  
  24.   
  25. public String getDecisionPath() {  
  26. return this.decisionPath;  
  27. }  
  28. }  



不要忘了點”SAVE“按鈕。

利用KIE-DROOLS書寫規則-規則




規則內容如下:

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. package org.sky.threshholdrulz;  
  2.   
  3. no-loop  
  4.   
  5. rule "approval decision by general manager"  
  6.     when  
  7.         m : PaymentInfo( moneyAmount>5000 );  
  8.     then  
  9.          modify (m) { setDecisionPath("GM") };  
  10. end  
  11.   
  12. rule "approval decision by manager"  
  13.     when  
  14.         m : PaymentInfo( moneyAmount<=5000 );  
  15.     then  
  16.          modify (m) { setDecisionPath("M") };  
  17. end  


利用KIE-DROOLS書寫規則-測試規則


我們這條規則其實很簡單:


如果PaymentInfo因子中的paymentAmount>5000,那麼PaymentInfo中的decisionPath返回就是字符串“GM”。


如果PaymentInfo因子中的paymentAmount<=5000,那麼PaymentInfo中的decisionPath返回就是字符串“M”。



利用KIE-DROOLS書寫規則-嚮導式的Test Scenario




利用KIE-DROOLS書寫規則-給測試用例創建數據











利用KIE-DROOLS書寫規則-運行測試



使用JAVA程序調用規則-規則存本地













結束本次教程


後面的教程會講述如何把.drools文件建到我們自己搭建的kie-drools workbench 6.3.0.Final上,然後用JAVA代碼遠程訪問的內容,這塊內容目前在國內的博文和論壇中幾乎無資料,筆者也是通過看源碼和看官方文檔後總結出來的。

其遠程訪問共分爲兩種:stateful(有狀態)和stateless(無狀態)2種,文中也會給出相應的對比和講解。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章