drools 6.5 -规则引擎入门详解编程语言

本文结构:
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) 随机策略


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 itxm on 
 */ 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 te st

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=中年]

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/15225.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论