本文结构:
1. Drools
2. Drools 规则引擎原理
3. 入门例子


1. Drools

Drools 具有一个易于访问企业策略、易于调整以及易于管理的开源业务 规则引擎,符合业内标准,速度快、效率高。业务分析师或审核人员可以利用它轻松查看业务规则,从而检验已编码的规则是否执行了所需的业务规则。其前身是 Codehaus 的一个开源项目叫 Drools,最近被纳入 JBoss 门下,更名为 JBoss Rules,成为了 JBoss 应用服务器的规则引擎。

目前,Drools 支持四种规则描述文件,分别是:drl 文件、 xls 文件、brl 文件和 dsl 文件,其中,常用的描述文件是 drl 文件和 xls 文件,而 xls 文件更易于维护,更直观,更为被业务人员所理解。


2. Drools 规则引擎原理

Drools 中的 Rete 算法被称为 ReteOO,表示 Drools 为面向对象系统(Object Oriented systems)增强并优化了 Rete 算法。

在 Drools 中,规则被存 放在 Production Memory(规则库)中,推理机要匹配的 facts(事实)被存在 Working Memory(工作内存)中。当时事实被插入到工作内存中后,规则引擎会把事实和规则库里的模式进行匹配,对于匹配成功的规则再由 Agenda 负责具体执行推理算法中被激发规则的结论部分,同时 Agenda 通过冲突决策策略管理这些冲突规则的执行顺序,Drools 中规则冲突决策策略有:

(1) 优先级策略
(2) 复杂度优先策略
(4) 广度策略
(5) 深度策略
(6) 装载序号策略
(7) 随机策略

drools 原理示意图


3. 入门例子

计算年龄小例子

age> 0 少年
age> 12 青年
age> 24 中年
age > 60 && age <80 老年

新建maven 项目,然后添加pom.xml依赖

小例子分五步
1. pom.xml 文件
2. pojo 类
3. rule.drl 文件
4. kmodel.xml
5. test检测

3.1pom.xml 文件如下。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.us</groupId><artifactId>droolsDemo</artifactId><version>1.0-SNAPSHOT</version><dependencies><!-- drools --><dependency><groupId>org.kie</groupId><artifactId>kie-api</artifactId><version>6.5.0.Final</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>6.5.0.Final</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>6.5.0.Final</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-decisiontables</artifactId><version>6.5.0.Final</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-templates</artifactId><version>6.5.0.Final</version></dependency><!--log4j--><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency></dependencies>
</project>

3.2 pojo

package com.us.person;/*** Created by yangyibo on 16/12/7.*/
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 + "]";}
}

3.3 rule.drl

rule.drl

package com.us.person;import com.us.person.Person;function void printName(String name,String desc) {System.out.println("name:"+name+" desc:"+ desc);}rule "boy"salience 1when$p : Person(age > 0);then$p.setDesc("少年");retract($p);printName($p.getName(),$p.getDesc());endrule "youth"salience 2when$p : Person(age > 12);then$p.setDesc("青年");retract($p);printName($p.getName(),$p.getDesc());endrule "midlife"salience 3when$p : Person(age > 24);then$p.setDesc("中年");retract($p);printName($p.getName(),$p.getDesc());endrule "old"lock-on-active truesalience 5when$p : Person(age > 60 && age <80)then$p.setDesc("老年");update($p);printName($p.getName(),$p.getDesc());end

3.4 kmodule.xml

如果没有 kmodule.xml 文件,在META-INF 文件夹下新建kmodule.xml 文件填写如下内容。

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule"><kbase name="SimpleRuleKBase" packages="com.us.person"><ksession name="simpleRuleKSession"/></kbase></kmodule>

3.5 test

package com.us.person;import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;/*** Created by yangyibo on 16/12/7.*/
public  class PersonTest {static KieSession getSession() {KieServices ks = KieServices.Factory.get();KieContainer kc = ks.getKieClasspathContainer();return kc.newKieSession("simpleRuleKSession");}public static void run() {KieSession ks = getSession();Person p1 = new Person("白展堂", 68);Person p2 = new Person("李大嘴", 32);Person p3 = new Person("佟湘玉", 18);Person p4 = new Person("郭芙蓉", 8);Person p5 = new Person("祝无双", 66);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);ks.insert(p5);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);System.out.println("after p4 : " + p5);ks.dispose();}public static void main(String[] args) {run();}
}

输出:

before p1 : [name=白展堂,age=68,desc=null]
before p2 : [name=李大嘴,age=32,desc=null]
before p3 : [name=佟湘玉,age=18,desc=null]
before p4 : [name=郭芙蓉,age=8,desc=null]
name:祝无双 desc:老年
name:白展堂 desc:老年
name:祝无双 desc:中年
name:李大嘴 desc:中年
name:白展堂 desc:中年
name:佟湘玉 desc:青年
name:郭芙蓉 desc:少年
总执行了7条规则——————————
after p1 : [name=白展堂,age=68,desc=中年]
after p2 : [name=李大嘴,age=32,desc=中年]
after p3 : [name=佟湘玉,age=18,desc=青年]
after p4 : [name=郭芙蓉,age=8,desc=少年]
after p4 : [name=祝无双,age=66,desc=中年]

drools 6.5 -规则引擎入门相关推荐

  1. python 规则引擎 drools_Drools规则引擎入门demo

    简单介绍 互联网旧系统维护中往往存在非常多的规则(比如:age < 16 || age > 50 -> REJECT ).最便捷的实现就是用 if-else 来写,但是随着规则的增加 ...

  2. Ilog、Drools、Jess规则引擎的Rule Language 比对

    Ilog JRules 今天对比了一下这三个颇有代表性的规则引擎的规则语言.其中Ilog是商业产品,没有机会实战. 作者:江南白衣 1.一样的If--Then 句式与Rete引擎     三者都会把原 ...

  3. python3 规则引擎_Ilog、Drools、Jess规则引擎的Rule Language 对比

    Ilog JRules 是最有名的商用BRMS,刚拿了JOLT: Drools 是最活跃的开源规则引擎,一路高歌猛进: Jess 是Clips的java实现,就如JRuby之于Ruby,是AI系的代表 ...

  4. Ilog、Drools、Jess规则引擎的Rule Language 对比

    Ilog JRules  是最有名的商用BRMS,刚拿了JOLT: Drools 是最活跃的开源规则引擎,一路高歌猛进: Jess 是Clips的java实现,就如JRuby之于Ruby,是AI系的代 ...

  5. 规则引擎 Drools

    规则引擎 Drools 文章目录 规则引擎 Drools 1. 问题引出 2. 规则引擎概述 2.1 什么是规则引擎 2.2 使用规则引擎的优势 2.3 规则引擎应用场景 2.4 Drools介绍 3 ...

  6. Drools规则引擎平台如何进行架构

    在<Drools7 规则引擎视频教程>的交流群中,有同学提出这样的问题:如果不想使用Drools官方提供的Workbench和KIE-Server进行规则的管理,而自行进行相应系统研发,该 ...

  7. 《Drools 规则引擎视频教程》相关事宜

    非常感谢大家能够有时间来看这篇博客,本篇博客主要介绍一下最近本人正在致力于的Drools 7 规则引擎文档和视频教程相关事项. Drools 本身在国内的技术网站上的资料就比较少,最近的视频教程更是几 ...

  8. 详解:Drools规则引擎探究

    引入 ▐ 问题引入 天猫奢品业务方为了吸引更多的新客,和提高会员的活跃度,做了一期活动,通过购买天猫奢品频道内的任意商品就赠送特殊积分,积分可以直接兑换限量的奢品商品.假如业务方给的规则如下: 主刃同 ...

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

    进入这个问题之前,先了解一下drools: 在很多行业应用中比如银行.保险领域,业务规则往往非常复杂,并且规则处于不断更新变化中,而现有很多系统做法基本上都是将业务规则绑定在程序代码中. 主要存在的问 ...

最新文章

  1. 1043 Is It a Binary Search Tree
  2. 从源码分析DEARGUI之add_radio_button
  3. 小程序时间转换成时间戳
  4. iis5.1/6.0/7.0+ 配置url重写 无扩展名伪静态
  5. 数据结构与算法————稀疏数组
  6. php前端路由权限,SaaS-前端权限控制
  7. 线性代数第九版pdf英文_《Linear Algebra Done Right》线性代数复习及部分习题解答(3.C)...
  8. Centos 5.6 安装subversion总结
  9. tcp网络示例客户端端以及代码,演示
  10. android10下载更新功能,Android 10部分新功能曝光 感觉越来越暗黑
  11. 计算机控制技术电子课件,电子科技大学计算机控制技术课件04.ppt
  12. 华为交换机导入配置_华为交换机配置导入和导出
  13. 【51单片机】OOK无线通讯在无线门磁报警中的应用
  14. 太原市山大附中2021年高考成绩查询,2021年太原高考状元名单公布,太原高考状元学校资料及最高分...
  15. Unity3d实现阿拉伯语适配,不规则特殊字符的处理。
  16. 元器件选型 之 安规电容篇
  17. Android开发制作带有侧边栏的联系人列表
  18. 【深度学习】半监督学习入门:Mean teachers
  19. 提薪必看 | 这5个提加薪最容易得罪人的坑,千万别踩雷
  20. 深度解析vivoX20四大创新突破!小米Mix2望尘莫及,雷军慌了

热门文章

  1. H5中安卓返回键拦截
  2. 程序员自我修养的那些事儿
  3. c语言/c++大作业基于easyx图形库自制RPG类型小游戏代码(附源码)
  4. java.lang.IllegalArgumentException: SimpleMessageConverter only supports String, byte[] and Serializ
  5. 用一句话概括Handler,并简述其原理
  6. 《Node.js 极简教程》 东海陈光剑
  7. MacOSX VMware Fusion 虚拟机黑屏的解决方案
  8. tensorflow自己实现SGD功能
  9. Linux中的常用命令(二)
  10. MyBatis:Invalid bound statement (not found)