您的位置:首页 > 其它

drools 6.5 -规则引擎入门

2016-12-25 20:07 405 查看
本文结构:

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 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=中年]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: