jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

时间:2023-12-18 17:03:02

前言

目前世面上中文的KIE DROOLS Workbench(JBOSS BRMS)的教程几乎没有,有的也只有灵灵碎碎的使用机器来翻译的(翻的不知所云)或者是基于老版本的JBOSS Guvnor即5.x的一些教程,而且这些教程都是”缺胳膊少腿“的,初学者看后不知道它到底在干吗?能干吗?能够解决自己系统中什么问题。

所以笔者自己写了几个例子,把整个最新的英文版的KIE DROOLS 6.3.0.Final的官方教程给串了起来,用于供读者使用并以此来作为入门以及相关SOA理念的推广的第一步。

本教程共分为”三“集。

什么是规则引擎

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

规则是让业务人士驱动整个企业过程的最佳实践


jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

业务规则在实现上的矛盾

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

业务规则技术

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

引入业务规则技术的目的

对系统的使用人员

  • 把业务策略(规则)的创建、修改和维护的权利交给业务经理
  • 提高业务灵活性
  • 加强业务处理的透明度,业务规则可以被管理
  • 减少对IT人员的依赖程度
  • 避免将来升级的风险

对IT开发人员

  • 简化系统架构,优化应用
  • 提高系统的可维护性和维护成本
  • 方便系统的整合
  • 减少编写“硬代码”业务规则的成本和风险

何为规则引擎

  • 可以将一个或多个的事实映射到一个或多个规则上
  • 接受数据输入,解释业务规则,并根据业务规则做出业务决策

一个简单的例子

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

从IT技术人员的角度看为什么使用规则引擎?

  • 从应用逻辑和数据中将业务逻辑分离
  • 简单! -规则有一个非常简单的结构
  • 让业务用户开发和维护规则以降低成本
  • 声明式编程
  • 性能和可伸缩性
  • 解决复杂的和复合的问题,其中有大量细粒度的规则和事实互动

DEMO-人寿新卓越变额万能寿险投保规则

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

DEMO-人寿新卓越变额万能寿险投保规则的IT实现

免体检累积最高限额表在规则引擎中的实现:

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

什么叫BRMS

什么是BRMS-考虑两个问题(IT管理者角度)

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

什么是BRMS-考虑两个问题(开发人员易用性角度)

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

BRMS-Business Rules Management System

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

一个优秀的BRMS应该具有的特点

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

BRMS中两个重要的概念:因子、公式

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

从业务的角度看因子与公式间的关系

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

从IT的角度看因子与公式间的关系

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

基于BRMS的系统逻辑架构

这个逻辑图有点复杂,很多人看了都会感觉“不知所云”,OK,不急!我们在后文中会来“回溯”它。

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

JBOSS Drools & Guvnor

世面上成熟的规则引擎有很多,著名的如:IBM 的iLog,pegga rulz(飞马),我们在这边要介绍的也是开源中最著名的jboss rulz。

Jboss Rulz最早是只有基于.drools的规则文件的一个内嵌式规则引擎,后来它发展成了“规则管理系统”即BRMS,它的BRMS被称为Guvnor。后来在JBOSS Guvnor5.x后它又改名叫"KIE Drools WorkBench“。

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

目前世面上中文的KIE DROOLS Workbench(JBOSS BRMS)的教程几乎没有,有的也只有灵灵碎碎的使用机器来翻译的(翻的不知所云)或者是基于老板的JBOSS Guvnor即5.x的一些教程,而且这些教程都是”缺胳膊少腿“的,初学者看后不知道它到底在干吗?能干吗?能够解决自己系统中什么问题。

所以笔者自己写了几个例子,把整个最新的英文版的KIE DROOLS 6.3.0.Final给串了起来,用于供读者使用并以此来作为入门SOA理念的推广的第一步。

Guvnor核心功能-最好的开源规则引擎

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

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目录下

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

2. 打开eclipse后按照Help->install new software输入以下地址

http://download.jboss.org/drools/release/6.3.0.Final/org.drools.updatesite/

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

3. 把drools-distribution-6.3.0.Final.zip解压在当前目录

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

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文件

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)
把该项目原来使用的H2Dialect改成MySQL5Dialect

<properties>
<!--property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/-->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
<property name="hibernate.max_fetch_depth" value="3"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="false"/>
<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.BTMTransactionManagerLookup"/>
<!-- BZ 841786: AS7/EAP 6/Hib 4 uses new (sequence) generators which seem to cause problems -->
<property name="hibernate.id.new_generator_mappings" value="false"/>
</properties>

6. 在tomcat的conf目录下增加一个文件名为:btm-config.properties的文件

使内容如下:
bitronix.tm.serverId=tomcat-btm-node0
bitronix.tm.journal.disk.logPart1Filename=${btm.root}/work/btm1.tlog
bitronix.tm.journal.disk.logPart2Filename=${btm.root}/work/btm2.tlog
bitronix.tm.resource.configuration=${btm.root}/conf/resources.properties

7. 在tomcat的conf目录下增加一个文件名为:resources.properties的文件

resource.ds1.className=bitronix.tm.resource.jdbc.lrc.LrcXADataSource
resource.ds1.uniqueName=jdbc/jbpm
resource.ds1.minPoolSize=10
resource.ds1.maxPoolSize=20
resource.ds1.driverProperties.driverClassName=com.mysql.jdbc.Driver
resource.ds1.driverProperties.url=jdbc:mysql://192.168.0.101:3306/drools?useUnicode=true&characterEncoding=UTF-8
resource.ds1.driverProperties.user=kie
resource.ds1.driverProperties.password=aaaaaa
resource.ds1.allowLocalTransactions=true

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

增加如下内容:
<Resource name="jdbc/jbpm" auth="Container" type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.0.101:3306/drools?useUnicode=true&characterEncoding=UTF-8"
username="kie"
password="aaaaaa"
maxActive="20"
maxIdle="1"
maxWait="5000" />

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

增加如下内容:

<Valve className="org.kie.integration.tomcat.JACCValve" /> 

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

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

增加如下内容:

<user username="tomcat" password="tomcat" roles="admin,manager,manager-gui"/>

该用户用于访问drools kie

11. 在mysql中建立一个schema,名为drools

并为该schema分配一个用户,该用户如果是通过远程访问mysql记得该用户要建成%(或者是username@ip地址)这样的格式,因为drools在第一次运行时会通过JPA在相应的DB内建立39张表。
jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

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

增加如下内容
export CATALINA_HOME="/opt/tomcat1"
export CATALINA_OPTS="-Dbtm.root=$CATALINA_HOME \
-Dbitronix.tm.configuration=$CATALINA_HOME/conf/btm-config.properties \
-Djbpm.tsr.jndi.lookup=java:comp/env/TransactionSynchronizationRegistry \
-Djava.security.auth.login.config=$CATALINA_HOME/webapps/kie-drools/WEB-INF/classes/login.config \
-Dorg.jboss.logging.provider=jdk"
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目录下观察日志文件:
jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

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

KIE的使用

使用tomcat/tomcat(在tomcat-users.xml文件中配置的具有admin/analyst角色的用户即可登录)
jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

新建一个Project

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)
jboss规则引擎KIE Drools 6.3.0 Final 教程(1)
可以看到,在KIE-DROOLS里的project其实就是一个maven工程
如果在新建Project时碰到让你必须"Select a repository”,请按照下面步骤操作
jboss规则引擎KIE Drools 6.3.0 Final 教程(1)
jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

在project里新建一条规则

为了练习,我们将新建一条规则,这条规则很简单:

假设有一报销流程,需要经过部门经理审批后到财务,如果员工的报销经额大于5,000那么除部门经理需要审批外还要报总经理再审批。

这是一条业务规则,假设哪天总经理说“大于5,000就要我批,我太烦了,改成大于10,000块才需要我审核吧”,想一下我们传统的做法。

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

利用KIE-DROOLS书写规则-建立因子

该规则涉及到一个公式 money>X
该规则涉及到一个因子,money

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

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)
这个Data Object就是因子
jboss规则引擎KIE Drools 6.3.0 Final 教程(1)
你可以在eclipse里把这个POJO写好后直接复制到KIE-DROOLS的Data Object编辑界面中去:
package org.sky.threshholdrulz;

public class PaymentInfo implements java.io.Serializable {

static final long serialVersionUID = 1L;

public PaymentInfo() {
} private int moneyAmount = 0;
private String decisionPath = ""; public void setMoneyAmount(int amount) {
this.moneyAmount = amount;
} public int getMoneyAmount() {
return this.moneyAmount;
} public void setDecisionPath(String path) {
this.decisionPath = path;
} public String getDecisionPath() {
return this.decisionPath;
}
}

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

不要忘了点”SAVE“按钮。

利用KIE-DROOLS书写规则-规则

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)
规则内容如下:
package org.sky.threshholdrulz;

no-loop

rule "approval decision by general manager"
when
m : PaymentInfo( moneyAmount>5000 );
then
modify (m) { setDecisionPath("GM") };
end rule "approval decision by manager"
when
m : PaymentInfo( moneyAmount<=5000 );
then
modify (m) { setDecisionPath("M") };
end

利用KIE-DROOLS书写规则-测试规则

我们这条规则其实很简单:

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

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

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

利用KIE-DROOLS书写规则-向导式的Test Scenario

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

利用KIE-DROOLS书写规则-给测试用例创建数据

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)
jboss规则引擎KIE Drools 6.3.0 Final 教程(1)
jboss规则引擎KIE Drools 6.3.0 Final 教程(1)
jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

利用KIE-DROOLS书写规则-运行测试

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

使用JAVA程序调用规则-规则存本地

jboss规则引擎KIE Drools 6.3.0 Final 教程(1)
jboss规则引擎KIE Drools 6.3.0 Final 教程(1)
jboss规则引擎KIE Drools 6.3.0 Final 教程(1)
jboss规则引擎KIE Drools 6.3.0 Final 教程(1)
jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

结束本次教程

后面的教程会讲述如何把.drools文件建到我们自己搭建的kie-drools workbench 6.3.0.Final上,然后用JAVA代码远程访问的内容,这块内容目前在国内的博文和论坛中几乎无资料,笔者也是通过看源码和看官方文档后总结出来的。
其远程访问共分为两种:stateful(有状态)和stateless(无状态)2种,文中也会给出相应的对比和讲解。