zoukankan      html  css  js  c++  java
  • jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

    前言


    眼下世面上中文的KIE DROOLS Workbench(JBOSS BRMS)的教程差点儿没有,有的也仅仅有灵灵碎碎的使用机器来翻译的(翻的不知所云)或者是基于老版本号的JBOSS Guvnor即5.x的一些教程,并且这些教程都是”缺胳膊少腿“的。刚開始学习的人看后不知道它究竟在干吗?能干吗?能够解决自己系统中什么问题。

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

    本教程共分为”三“集。


    什么是规则引擎





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






    业务规则在实现上的矛盾



    业务规则技术



    引入业务规则技术的目的

    对系统的使用人员

    • 把业务策略(规则)的创建、改动和维护的权利交给业务经理
    • 提高业务灵活性
    • 加强业务处理的透明度,业务规则能够被管理
    • 降低对IT人员的依赖程度
    • 避免将来升级的风险
    对IT开发者
    • 简化系统架构,优化应用
    • 提高系统的可维护性和维护成本
    • 方便系统的整合
    • 降低编写“硬代码”业务规则的成本和风险

    何为规则引擎

    • 能够将一个或多个的事实映射到一个或多个规则上
    • 接受数据输入。解释业务规则。并依据业务规则做出业务决策

    一个简单的样例



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

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


    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输入以下地址


    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: omcat7webappskie-droolsWEB-INFclassesMETA-INF文件夹下的persistence.xml文件




    把该项目原来使用的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. tomcatconf文件夹下添加一个文件名称为: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张表。






    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文件夹下观察日志文件:



    打开一个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里新建一条规则

    为了练习,我们将新建一条规则。这条规则非常easy:


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




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




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

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


    依照上述思想。我们先建立因子



    这个Data Object就是因子



    你能够在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;
    }
    }
    



    不要忘了点”SAVE“button。


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




    规则内容例如以下:

    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书写规则-測试规则


    我们这条规则事实上非常easy:


    假设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种。文中也会给出对应的对照和解说。
  • 相关阅读:
    Chapter 8. 面向对象(类库、委托)
    Chapter 8. 面向对象(多态--接口)
    练习:C# -- 多态
    Chapter 8. 面向对象(多态--抽象类)
    Chapter 8. 面向对象(多态--虚方法)
    Chapter 8. 面向对象(继承)
    Chapter 8. 面向对象(封装)
    Chapter 8. 面向对象(类、对象、字段、方法、属性、构造函数)
    练习、C# 结构体、冒泡排序
    1月19日(HTML之旅) CSS样式表
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7261727.html
Copyright © 2011-2022 走看看