drools 6.5 -规则引擎入门
2016-12-25 20:07
405 查看
本文结构:
1. Drools
2. Drools 规则引擎原理
3. 入门例子
目前,Drools 支持四种规则描述文件,分别是:drl 文件、 xls 文件、brl 文件和 dsl 文件,其中,常用的描述文件是 drl 文件和 xls 文件,而 xls 文件更易于维护,更直观,更为被业务人员所理解。
在 Drools 中,规则被存 放在 Production Memory(规则库)中,推理机要匹配的 facts(事实)被存在 Working Memory(工作内存)中。当时事实被插入到工作内存中后,规则引擎会把事实和规则库里的模式进行匹配,对于匹配成功的规则再由 Agenda 负责具体执行推理算法中被激发规则的结论部分,同时 Agenda 通过冲突决策策略管理这些冲突规则的执行顺序,Drools 中规则冲突决策策略有:
(1) 优先级策略
(2) 复杂度优先策略
(4) 广度策略
(5) 深度策略
(6) 装载序号策略
(7) 随机策略
![](https://img-blog.csdn.net/20161225182239960?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjM3MzgxNQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
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检测
输出:
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=中年]
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.drlpackage 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 1 when $p : Person(age > 0); then $p.setDesc("少年"); retract($p); printName($p.getName(),$p.getDesc()); end rule "youth" salience 2 when $p : Person(age > 12); then $p.setDesc("青年"); retract($p); printName($p.getName(),$p.getDesc()); end rule "midlife" salience 3 when $p : Person(age > 24); then $p.setDesc("中年"); retract($p); printName($p.getName(),$p.getDesc()); end rule "old" lock-on-active true salience 5 when $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入门(二)-----规则引擎Drools解决汽水问题(复杂逻辑)
- drools5.3 jboss 规则引擎入门eclipse IDE 环境
- drools入门(二)-----规则引擎Drools解决汽水问题
- 【Drools-开源业务规则引擎】入门实例(含源码)
- drools入门(二)-----规则引擎Drools解决汽水问题(复杂逻辑)
- Drools规则引擎初学入门实例HelloWorld
- 【Drools-开源业务规则引擎】入门实例(含源码)
- Java规则引擎-Drools
- JBoss Rules 学习(三): Drools规则引擎 (上)
- Java规则引擎-Drools
- Java规则引擎-Drools
- JBoss Rules 学习笔记(三)——DRools规则引擎(上)
- Java规则引擎-Drools
- 使用 Drools 规则引擎实现业务逻辑
- Java规则引擎-Drools
- Java规则引擎-Drools
- Java规则引擎-Drools
- Java规则引擎:开源Drools项目
- Java规则引擎-Drools
- Java规则引擎-Drools