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方法来通知规则引擎执行规则。

Drools应用实例的更多相关文章

  1. JAVA规则引擎 -- Drools

    Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效. 本文所使用的de ...

  2. [Drools]JAVA规则引擎 -- Drools

    Drools是一个基于Java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效. 本文所使用的de ...

  3. [Drools]JAVA规则引擎 -- Drools- 转http://blog.csdn.net/quzishen/article/details/6163012

    [Drools]JAVA规则引擎 -- Drools 标签: java引擎exceptiongetterstringsetter 2011-01-25 14:33 113340人阅读 评论(35) 收 ...

  4. 最近学习工作流 推荐一个activiti 的教程文档

    全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...

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

    package droolsDemo //说明:每个 drl 都必须声明一个包名,这个包名与 Java 里面的不同,它不需要与文件夹的层次结构一致, //主要用于可以根据kmodule.xml中不同的 ...

  6. [Drools]JAVA规则引擎 -- Drools 2

    上一篇文章 http://blog.csdn.net/quzishen/archive/2011/01/25/6163012.aspx 描述了一些常用的drools的语法标签和一个模拟实例即发送积分的 ...

  7. Drools文档(六) 用户手册

    用户手册 基础 无状态的知识Session Drools规则引擎拥有大量的用例和功能,我们要如何开始?你无须担心,这些复杂性是分层的,你可以用简单的用例来逐步入门. 无状态Session,无须使用推理 ...

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

    规则语言参考 概述 Drools有一个"本地"的规则语言.这种格式在标点符号上非常轻,并且通过"扩展器"支持自然语言和领域特定的语言,使语言能够变形到您的问题领 ...

  9. Drools(BRMS) 速成教程(上)

    大家在日常开发中,肯定遇到过一些业务规则变来变去的需求,比如:会员积分系统(今天要新注册会员送10积分,明天要改成注册送优惠券,后天搞活动要改成注册自动变成高级会员...),此类需求,一般都是通过写i ...

随机推荐

  1. ubuntu12.04下安装搜狗拼音

    Ubuntu 12.04 LTS 版本   由于 Ubuntu 12.04 LTS 自带的 Fcitx 版本较旧,需要先通过 PPA 升级,才能安装下载的 deb 软件包.   1. 点击左上角的图标 ...

  2. g2o使用bug总结

    g2o进行3d2d优化的时候,设置优化图的边时,注意setVertex()中顶点的顺序. void setVertex(size_t i, Vertex* v) { assert(i < _ve ...

  3. 20个Flutter实例视频教程-第09节: 保持页面状态-2

    视频地址:https://www.bilibili.com/video/av39709290/?p=9 博客地址:https://jspang.com/post/flutterDemo.html#to ...

  4. c# 字符串大小写转换

    //小转大 string lower = "converted from lowercase"; Console.WriteLine(lower.ToUpper()); //大转小 ...

  5. 原创|高逼格企业级MySQL数据库备份方案,原来是这样....

    很多人,这里说的是运维工程师们,一提到写某某方案,很是头疼.不是上某度一统搜索,就是同样一句话在N个群全部群发一遍:“有没有某某方案,可以共享一下的吗??求助,各位大佬们”,估计十有八九,全部石沉大海 ...

  6. E20180607-hm

    duplicate v. 重复; 复制; 复印;  adj. 复制的; 副本的; 完全一样的;        n. 副本; 完全一样的东西; 复制品; adjacent adj. 相邻; 邻近的,毗邻 ...

  7. VS2010在WIN7下安装报错“下列组件安装失败”如何解决

    VS2010在WIN7下安装报错“下列组件安装失败”如何解决 http://www.111cn.net/net/42/75914.htm

  8. [3dmax教程] 人物+骨骼+蒙皮+动画教程

    人物+骨骼+蒙皮+动画完整教程选准备好一个人,做人的方法我在这里就不做了,大家可以学都用poser来做一个.  在大腿里建立4根骨骼! 在前视图中移动如图所示位置! 做一段简单的骨骼向前伸的动画,做4 ...

  9. Python 3.x 的一些注意事项

    1. reload 被更改 需要 在console执行 from imp import reload 才能调用CT 同时,如果py文件是位于主文件夹深部的位置,可以这么做: import ComicT ...

  10. bzoj 2502: 清理雪道【有上下界有源汇最小流】

    对于原有边,流区间是(1,inf),按着原边连,然后再连(s,i,(0,inf)),(i,t,(0,inf))表示任意位置进出雪场 按着这个建出新图 然后最小流的方法是先跑可行流,设ans为(t,s, ...