Drools应用实例

Drools 实例介绍

  • Drools编译与运行:

    • 在Drools当中,规则的编译与运行要通过Drools提供的各种API来实现,这些API总体来讲可以分为三类:规则编译、规则收集和规则的执行。
  • Kmodule.xml的编写
    • kmodule.xml文件放到

      src/main/resources/META-INF/文件夹下

    • 代码的实现(具体内容)
    • <?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>
      </kmodule>
      • 一个kmodule里面包含了两个kbase,这个也是我们这个例子里面的两个用例
      • 分别对应drl规则文件的例子,一个是对应Excel表格的规则例子。每一个kbase都有一个name,可以取任意字符串,但是不能重名。
      • 然后都有一个packages,可以看到packages里面的字符串其实就是src/main/resources下面的文件夹的名称,或者叫包名,规则引擎会根据这里定义的包来查找规则定义文件。可以同时定义多个包,以逗号分隔开来就行。每一个kbase下面可以包含多个ksession,当然本例中都自定义了一个。
      • 每一个ksession都有一个name,名字也可以是任意字符串,但是也不能重复。

        kbase和ksession里面的name属性是全局不能重复的。kbase和ksession中其实还有很多其它的属性,每一个kbase下面可以包含多个ksession。

      • 在运行时,KieContainer会根据*Model对象来创建KieModule、KieBase、KieSession对象。其中KieModule和KieBase只会创建一次,而KieSession则有可能创建多次,因为KieSession的创建成本很低,同时KieSession包含了运行时的数据,所以可以销毁、创建若干次。
  • Drools运行测试
    • 定义一个POJO类
    • package com.drool.test;
      
      public class Person {
          private String name;
          private int age;
          private String desc;
      
          public Person(String name, int age) {
              this.name = name;
              this.age = age;
          }
          public String getName() {
              return name;
          }
          public void setName(String name) {
              this.name = name;
          }
          public int getAge() {
              return age;
          }
          public void setAge(int age) {
              this.age = age;
          }
          public String getDesc() {
              return desc;
          }
          public void setDesc(String desc) {
              this.desc = desc;
          }
          public String toString()
          {
              return "[name="+name+",age="+age+",desc="+desc+"]";
          }
      }
    • 编辑配置文件
    • <?xml version="1.0" encoding="UTF-8"?>
      <kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
                 <!-- packages =‘表示drl 文件所在位置‘ -->
          <kbase name="SimpleRuleKBase" packages="com.drool.test">
               <! --kession name=‘表示 被引用的规则名‘-->
              <ksession name="simpleRuleKSession" default="true"/>
          </kbase>
      </kmodule>  
    • 编辑规则: 

      person.drl
    • package com.person;<! -- 这里的包路径可以不并写到相应的位置 -->
      
      import com.drool.test.Person;<!-- 这里引用的POJO必须是正确的 -- >
      
      rule "boy"    <! -- 规则名  -->
          salience 1  <!-- 优先级, 值越大,优先级越高 -->
          when
              $p : Person(age > 0);
          then
              $p.setDesc("少年");
              retract($p);
      end
      
      rule "youth"
          salience 2
          when
              $p : Person(age > 12);
          then
              $p.setDesc("青年");
              retract($p);
      end
      
      rule "midlife"
          salience 3
          when
              $p : Person(age > 24);
          then
              $p.setDesc("中年");
              retract($p);
      end
      
      rule "old"
          salience 4
          when
              $p : Person(age > 60);
          then
              $p.setDesc("老年");
              retract($p);
      end
      

       

    • 测试类
    • package com.drool.test;
      import org.kie.api.KieServices;
      import org.kie.api.runtime.KieContainer;
      import org.kie.api.runtime.KieSession;
      
      public class Test
      {
          static KieSession getSession()
          {
              KieServices ks = KieServices.Factory.get();
      
              KieContainer kc = ks.getKieClasspathContainer();
      
              return kc.newKieSession("simpleRuleKSession");
          }
          public static void main(String[] args)
          {
              KieSession ks = getSession();//
      
              Person p1 = new Person("白展堂", 68);
              Person p2 = new Person("李大嘴", 32);
              Person p3 = new Person("佟湘玉", 18);
              Person p4 = new Person("郭芙蓉", 8);
      
              System.out.println("before p1 : " + p1);
              System.out.println("before p2 : " + p2);
              System.out.println("before p3 : " + p3);
              System.out.println("before p4 : " + p4);
      
              ks.insert(p1);
              ks.insert(p2);
              ks.insert(p3);
              ks.insert(p4);
      
              int count = ks.fireAllRules();
              System.out.println("总执行了"+count+"条规则");
              System.out.println("after p1 : " + p1);
              System.out.println("after p2 : " + p2);
              System.out.println("after p3 : " + p3);
              System.out.println("after p4 : " + p4);
              ks.dispose();
          }
      }
      

        

    • 输出结果

      从classpath中读取kmodule,创建KieContainder容器,利用kieContainer对象创建一个新的KieSession,创建session的时候我们传入了一个name:"simpleRuleKSession”,这个字符串很眼熟吧,这个就是我们定义的kmodule.xml文件中定义的ksession的name。

      kieContainer根据kmodule.xml定义的ksession的名称找到KieSession的定义,然后创建一个KieSession的实例。

      KieSession就是一个到规则引擎的链接,通过它就可以跟规则引擎通讯,并且发起执行规则的操作。

      通过kSession.insert方法来将事实(Fact)插入到引擎中,也就是Working Memory中。

      然后通过kSession.fireAllRules方法来通知规则引擎执行规则。

时间: 2024-10-13 11:52:22

Drools应用实例的相关文章

JAVA规则引擎 -- Drools

Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效. 本文所使用的demo已上传 http://download.csdn.net/source/3002213 1.Drools语法 开始语法之前首先要了解一下drools的基本工作过程,通常而言我们使用一个接口来做事情,首先要穿进去参数,其次要获取到接口的实现执行完毕后的结果,而drools也是一样的,我们需要传递进

[Drools]JAVA规则引擎 -- Drools

Drools是一个基于Java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效. 本文所使用的demo已上传 http://download.csdn.net/source/3002213 1.Drools语法 开始语法之前首先要了解一下drools的基本工作过程,通常而言我们使用一个接口来做事情,首先要穿进去参数,其次要获取到接口的实现执行完毕后的结果,而drools也是一样的,我们需要传递进

Drools规则引擎初窥---drl和决策表实现[实例]

因项目需要,看了下drools规则引擎.写了一个比较简单的drools的drl规则和决策表实现的例子. 规则说明: 网络商城要举办活动(奖励额外积分), 订单原价金额在 100以下, 不加分 100-500 加100分 500-1000 加500分 1000 以上 加1000分 1.建立最基本的Drools项目结构并引入必须的类库.(这里采用junit来执行单元测试).创建一个Java Project,建立maven形式的源码包. 2.定义实体类Order.java 1 import java.

Drools规则引擎详解-常用的drl实例

package droolsDemo //说明:每个 drl 都必须声明一个包名,这个包名与 Java 里面的不同,它不需要与文件夹的层次结构一致, //主要用于可以根据kmodule.xml中不同的package属性来指定加载哪个.drl文件, //packages="org.some.pkg"表示ksession2只会加载org.some.pkg下的规则文件,如果没写,则默认加载所有的规则文件. //导入实体类 import com.qianxin.rulesengine.droo

【Drools-开源业务规则引擎】入门实例(含源码)

该实例转自:http://blog.csdn.net/quzishen/article/details/6163012 便于理解的应用实例1: 现在我们模拟一个应用场景:网站伴随业务产生而进行的积分发放操作.比如支付宝信用卡还款奖励积分等. 发放积分可能伴随不同的运营策略和季节性调整,发放数目和规则完全不同,如果使用硬编码的方式去伴随业务调整而修改,代码的修改.管理.优化.测试.上线将是一件非常麻烦的事情,所以,将发放规则部分提取出来,交给Drools管理,可以极大程度的解决这个问题. (注意一

drools规则引擎因为内存泄露导致的内存溢出

进入这个问题之前,先了解一下drools: 在很多行业应用中比如银行.保险领域,业务规则往往非常复杂,并且规则处于不断更新变化中,而现有很多系统做法基本上都是将业务规则绑定在程序代码中. 主要存在的问题有以下几个方面: 1) 当业务规则变更时,对应的代码也得跟着更改,每次即使是小的变更都需要经历开发.测试验证上线等过程,变更成本比较大. 2) 长时间系统变得越来越难以维护. 3) 开发团队一般是由一个熟悉业务的BA(业务分析人员)和若干个熟悉技术的开发人员组成,开发人员对业务规则的把握能力远不及

jboss规则引擎KIE Drools 6.3.0-高级讲授篇

在生产环境怎么用BRMS 回溯BRMS开发教程中的那张"业务变现加速器"架构图,考虑下面的问题 业务开发人员开发规则 IT人员提供FACT 关键在于"全动态" SQL语句改了怎么办?不重启 DAO层改了怎么办?不重启 Mybatis的配置文件改了怎么办?不重启 按照上次的<jboss规则引擎KIE Drools 6.3.0 Final 教程>,一起来看一个实际的场景 如何熊掌与鱼兼得? 做到以下几点是否就可以"全得"? 规则更改不重启

Drools文档(八) 规则语言参考

规则语言参考 概述 Drools有一个"本地"的规则语言.这种格式在标点符号上非常轻,并且通过"扩展器"支持自然语言和领域特定的语言,使语言能够变形到您的问题领域.本章主要与本机规则格式一致.用于表示语法的图表被称为"铁路"图表,它们基本上是语言术语的流程图.技术上非常热衷的也可以参考DRL.g这是规则语言的Antlr3语法.如果您使用Rule Workbench,则可以通过内容帮助为您完成许多规则结构,例如,输入"ru"并按

Drools 速成教程(上)

大家在日常开发中,肯定遇到过一些业务规则变来变去的需求,比如:会员积分系统(今天要新注册会员送10积分,明天要改成注册送优惠券,后天搞活动要改成注册自动变成高级会员...),此类需求,一般都是通过写if分支来实现的,参考下面: if (规则条件1){ //处理1 } else if (规则条件2){ //处理2 } else if (规则条件3){ //处理3 } ... 这种代码毫无营养,而且很枯燥,有没有办法,将业务规则从代码中抽离出来,以后规则变了,不用改代码,只改规则配置就行? 今天要介