Drools5规则引擎学习研究NEW.docx

上传人:b****4 文档编号:4628658 上传时间:2022-12-07 格式:DOCX 页数:15 大小:186.75KB
下载 相关 举报
Drools5规则引擎学习研究NEW.docx_第1页
第1页 / 共15页
Drools5规则引擎学习研究NEW.docx_第2页
第2页 / 共15页
Drools5规则引擎学习研究NEW.docx_第3页
第3页 / 共15页
Drools5规则引擎学习研究NEW.docx_第4页
第4页 / 共15页
Drools5规则引擎学习研究NEW.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

Drools5规则引擎学习研究NEW.docx

《Drools5规则引擎学习研究NEW.docx》由会员分享,可在线阅读,更多相关《Drools5规则引擎学习研究NEW.docx(15页珍藏版)》请在冰豆网上搜索。

Drools5规则引擎学习研究NEW.docx

Drools5规则引擎学习研究NEW

Drools5规则引擎学习研究

 

编写人:

梁利平

日期:

2010-09-25

 

1.Drools介绍

Drools(JBossRules)具有一个易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。

业务分析师或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了所需的业务规则。

JBossRules的前身是Codehaus的一个开源项目叫Drools。

最近被纳入JBoss门下,更名为JBossRules,成为了JBoss应用服务器的规则引擎。

Drools是为Java量身定制的基于CharlesForgy的RETE算法的规则引擎的实现。

具有了OO接口的RETE,使得商业规则有了更自然的表达。

附:

Rete算法:

在拉丁语中是“net”,有网络的意思。

Rete匹配算法是一种进行大量模式集合和大量对象集合间比较的高效方法,通过这种方法找出所有匹配各个模式的对象。

可以分为两部分:

规则编辑和运行时执行。

2.学习前的准备

在使用Drools5之前需要在开发机器上安装好JDK1.6(可变)或以上环境及MyEclipse8.5以上。

2.1.开发环境搭建

1下载drools-5.1.1-eclipse-all.zip,解压,将plugins下的包文件描述配置到MyEclipse8.5\configuration\org.eclipse.equinox.simpleconfigurator\bundles.info文件中:

追加配置描述:

org.drools.eclipse.task,5.1.1,file:

/D:

\workdir\doc\studyDoc\drools\eclipse\plugins\\org.drools.eclipse.task_5.1.1.jar,4,false

org.drools.eclipse,5.1.1,file:

/D:

\workdir\doc\studyDoc\drools\eclipse\plugins\\org.drools.eclipse_5.1.1.jar,4,false

org.eclipse.webdav,3.0.101,file:

/D:

\workdir\doc\studyDoc\drools\eclipse\plugins\\org.eclipse.webdav_3.0.101.jar,4,false

org.guvnor.tools,5.1.1,file:

/D:

\workdir\doc\studyDoc\drools\eclipse\plugins\\org.guvnor.tools_5.1.1.jar,4,false

2配置好后重启myeclipse

3如果看到以下图片,则说明配置成功:

2.2.开发第一个规则

1.创建DroolsProject,下一步

2.输入工程名称,下一步

3.选择创建规则文件及规则java类,下一步

4.选择Drools版本,完成

5.生成drools代码如下,运行DroolsTest可查看效果

3.规则的编译与运行

DroolsAPI可以分为三类:

规则编译、规则收集和规则的执行

API:

1.KnowledgeBuilder规则编译:

规则文件进行编译,最终产生一批编译好的规则包(KnowledgePackage)供其它的应用程序使用

2.KnowledgeBase:

提供的用来收集应用当中知识(knowledge)定义的知识库对象,在一个KnowledgeBase当中可以包含普通的规则(rule)、规则流(ruleflow)、函数定义(function)、用户自定义对象(typemodel)等

3.StatefulKnowledgeSession:

是一种最常用的与规则引擎进行交互的方式,它可以与规则引擎建立一个持续的交互通道,在推理计算的过程当中可能会多次触发同一数据集。

在用户的代码当中,最后使用完StatefulKnowledgeSession对象之后,一定要调用其dispose()方法以释放相关内存资源。

有状态的

4.StatelessKnowledgeSession:

使用StatelessKnowledgeSession对象时不需要再调用dispose()方法释放内存资源不能进行重复插入fact的操作、也不能重复的调用fireAllRules()方法来执行所有的规则,对应这些要完成的工作在StatelessKnowledgeSession当中只有execute(…)方法,通过这个方法可以实现插入所有的fact并且可以同时执行所有的规则或规则流,事实上也就是在执行execute(…)方法的时候就在StatelessKnowledgeSession内部执行了insert()方法、fireAllRules()方法和dispose()方法

5.Fact:

是指在Drools规则应用当中,将一个普通的JavaBean插入到规则的WorkingMemory当中后的对象规则可以对Fact对象进行任意的读写操作,当一个JavaBean插入到WorkingMemory当中变成Fact之后,Fact对象不是对原来的JavaBean对象进行Clone,而是原来JavaBean对象的引用

4.规则

4.1.规则文件

在Drools当中,一个标准的规则文件就是一个以“.drl”结尾的文本文件,标准的规则文件格式:

packagepackage-name//包名是必须的,并放在第一行,包名对于规则文件中规则的管理只限于逻辑上的

imports

globals

functions

queries

rules

4.2.规则语言

一个标准规则的结构

rule"name"//规则名称

attributes//属性部分

when

LHS//lefthandsid条件部分

then

RHS//righthandsid结果部分

End

4.2.1.条件部分

条件部分又被称之为LeftHandSide,简称为LHS,条件又称之为pattern(匹配模式):

在一个规则当中when与then中间的部分就是LHS部分。

在LHS当中,可以包含0~n个条件,如果LHS部分没空的话,那么引擎会自动添加一个eval(true)的条件,由于该条件总是返回true,所以LHS为空的规则总是返回true,在Drools

当中在pattern中没有连接符号,那么就用and来作为默认连接,所以在该规则的LHS部分中两个pattern只有都满足了才会返回true。

默认情况下,每行可以用“;”来作为结束符(和Java的结束一样),当然行尾也可以不加“;”结尾。

约束连接:

对于对象内部的多个约束的连接,可以采用“&&”(and)、“||”(or)和“,”(and)来实现,表面上看“,”与“&&”具有相同的含义,但是有一点需要注意,“,”与“&&”和“||”不能混合使用,也就是说在有“&&”或“||”出现的LHS当中,是不可以有“,”连接符出现的,反之亦然。

1.比较操作符:

共计12种:

>、>=、<、<=、==、!

=、

contains、notcontains、memberof、notmemberof、matches、notmatches

1)Contains:

比较操作符contains是用来检查一个Fact对象的某个字段(该字段要是一个Collection或是一个Array类型的对象)是否包含一个指定的对象

contains只能用于对象的某个Collection/Array类型的字段与另外一个值进行比较,作为比较的值可以是一个静态的值,也可以是一个变量(绑定变量或者是一个global对象)

示例:

packagetest

rule"rule1"

when

$order:

Order();

$customer:

Customer(age>20,orderscontains$order);

then

System.out.println($customer.getName());

end

2)NotContains:

与contains作用相反

3)MemberOf:

是用来判断某个Fact对象的某个字段是否在一个集合(Collection/Array)当中,用法与contains有些类似,但也有不同,memberof前边是某个数据对象且一定要是一个变量(绑定变量或者是一个global对象),后边是数据对象集合:

示例:

packagetest

globalString[]orderNames;

rule"rule1"

when

$order:

Order(namememberOforderNames);

then

System.out.println($order.getName());

End

4)Notmemberof:

与memberof作用相反

5)Matches:

matches是用来对某个Fact的字段与标准的Java正则表达式进行相似匹配,被比较的字符串可以是一个标准的Java正则表达式,但有一点需要注意,那就是正则表达式字符串当中不用考虑“\”的转义问题

示例:

packagetest

importjava.util.List;

rule"rule1"

when

$customer:

Customer(namematches"李.*");

then

System.out.println($customer.getName());

end

6)notmatches:

与matches相反

结果部分:

结果部分又被称之为RightHandSide,简称为RHS,在一个规则当中then后面部分就是RHS,只有在LHS的所有条件都满足时RHS部分才会执行,salience该属性的作用是通过一个数字来确认规则执行的优先级,数字越大,执行越靠前。

函数介绍:

✓Insert:

作用与我们在Java类当中调用StatefulKnowledgeSession对象的insert方法的作用相同,都是用来将一个Fact对象插入到当前的WorkingMemory当中。

一旦调用insert宏函数,那么Drools会重新与所有的规则再重新匹配一次

✓insertLogical:

作用与insert类似,它的作用也是将一个Fact对象插入到当前的WorkingMemroy当中

✓update:

用来实现对当前WorkingMemory当中的Fact进行更新。

如果希望规则只执行一次,那么可以通过设置规则的no-loop属性为true来实现

示例:

packagetest

importjava.util.List;

query"queryfactcount"

Customer();

end

rule"rule1"

salience2

when

eval(true);

then

Customercus=newCustomer();

cus.setName("张三");

cus.setAge

(1);

insert(cus);

end

rule"rule2"

salience1

when

$customer:

Customer(name=="张三",age<10);

then

$customer.setAge($customer.getAge()+1);

update($customer);

System.out.println("----------"+$customer.getName());

End

示例说明:

调用update宏函数更新Customer对象后WorkingMemory当中还只存在一个Customer对象

✓retract:

宏函数retract也是用来将WorkingMemory当中某个Fact对象从WorkingMemory当中删除

✓drools:

宏对象可以实现在规则文件里直接访问WorkingMemory

常用方法说明:

方法名称

含义说明

getWorkingMemory()

获取当前的WorkingMemory对象

halt()

在当前规则执行完成后,不再执行

其它未执行的规则。

getRule()

得到当前的规则对象

insert(newObject)

向当前的WorkingMemory当中插入

指定的对象,功能与宏函数insert

相同

update(newObject)

更新当前的WorkingMemory中指定

的对象,功能与宏函数update相同

update(FactHandle

Object)

更新当前的WorkingMemory中指定

的对象,功能与宏函数update相同。

retract(newObject)

从当前的WorkingMemory中删除指

定的对象,功能与宏函数retract相

同。

kcontext

作用主要是用来得到当前的

KnowledgeRuntime对象,KnowledgeRuntime对象可以实现与引擎的各种交互

✓Modify:

是一个表达式块,它可以快速实现对Fact对象多个属性进行修改,修改完成后会自动更新到当前的WorkingMemory当中

4.2.2.属性部分

规则的属性共有13个分别是:

activation-group、agenda-group、auto-focus、date-effective、date-expires、dialect、duration、enabled、lock-on-active、no-loop、ruleflow-group、salience、when

1.Salience:

属性的值是一个数字,数字越大执行优先级越高,同时它的值可以是一个负数。

默认情况下,规则的salience默认值为0,所以如果我们不手动设置规则的salience属性,那么它的执行顺序是随机的。

2.no-loop:

属性的值是一个布尔型,默认情况下规则的no-loop属性的值为false,如果no-loop属性值为true,那么就表示该规则只会被引擎检查一次,如果满足条件就执行规则的RHS部分

3.date-effective:

在规则运行时,引擎会自动拿当前操作系统的时间与date-effective设置的时间值进行比对,只有当系统时间>=date-effective设置的时间值时,规则才会触发执行,否则执行将不执行。

日期格式:

dd-MM-yyyy

4.date-expires该属性的作用与date-effective属性恰恰相反,如果大于系统时间,那么规则就执行,否则就不执行。

日期格式:

dd-MM-yyyy

5.enabled:

true执行该规则,false不执行该规则

6.dialect:

该属性用来定义规则当中要使用的语言类型:

mvel和java,如果没有手工设置规则的dialect,默认使用的java语言

7.duration:

该属性对应的值为一个长整型,单位是毫秒。

如果设置了该属性,那么规则将在该属性值之后时间,在另外一个线程里触发

8.lock-on-active:

该属性为boolean,当在规则上使用ruleflow-group属性或agenda-group属性的时候,将lock-on-action属性的值设置为true,可能避免因某些Fact对象被修改而使已经执行过的规则再次被激活执行

9.activation-group该属性的作用是将若干个规则划分成一个组,用一个字符串来给这个组命名,这样在执行的时候,具有相同activation-group属性的规则中只要有一个会被执行,其它的规则都将不再执行。

10.agenda-group:

agenda-group规则的调用与执行是通过StatelessSession或StatefulSession来实现的,一般的顺序是创建一个StatelessSession或StatefulSession,将各种经过编译的规则的package添加到session当中,接下来将规则当中可能用到的Global对象和Fact对象插入到Session当中,最后调用fireAllRules方法来触发、执行规则。

在没有调用最后一步fireAllRules方法之前,所有的规则及插入的Fact对象都存放在一个名叫Agenda表的对象当中,这个Agenda表中每一个规则及与其匹配相关业务数据叫做Activation,在调用fireAllRules方法后,这些Activation会依次执行,这些位于Agenda表中的Activation的执行顺序在没有设置相关用来控制顺序的属性时(比如salience属性),它的执行顺序是随机的,不确定的。

AgendaGroup是用来在Agenda的基础之上,对现在的规则进行再次分组,具体的分组方法可以采用为规则添加agenda-group属性来实现

11.auto-focus:

它的作用是用来在已设置了agenda-group的规则上设置该规则是否可以自动独取Focus,如果该属性设置为true,那么在引擎执行时,就不需要显示的为某个AgendaGroup设置Focus否则需要。

12.ruleflow-group:

在使用规则流的时候要用到ruleflow-group属性,该属性的值为一个字符串,作用是用来将规则划分为一个个的组,然后在规则流当中通过使用ruleflow-group属性的值,从而使用对应的规则

4.2.3.注释

1.单行注释:

采用“#”或者“//”来进行标记

2.多行注释:

以“/*”开始,以“*/”结束

4.3.函数

函数的编写位置可以是规则文件当中package声明后的任何地方

functionvoid/ObjectfunctionName(Typearg...){

/*函数体的业务代码*/

}

函数以function标记开头,可以有或无返回类型,然后定义方法名和参数,语法基本同java一致,不同规则文件的函数相互之间是不可见的。

示例:

packagetest

importjava.util.List;

importjava.util.ArrayList;

/*

一个测试函数

用来向Customer对象当中添加指定数量的Order对象的函数

*/

functionvoidsetOrder(Customercustomer,intorderSize){

Listls=newArrayList();

for(inti=0;i

Orderorder=newOrder();

ls.add(order);

}

customer.setOrders(ls);

}

/*

测试规则

*/

rule"rule1"

when

$customer:

Customer();

then

setOrder($customer,5);

System.out.println("rule1customerhasorder

size:

"+$customer.getOrders().size());

end

/*

测试规则

*/

rule"rule2"

when

$customer:

Customer();

then

setOrder($customer,10);

System.out.println("rule2customerhasorder

size:

"+$customer.getOrders().size());

end

4.4.查询

查询是Drools当中提供的一种根据条件在当前的WorkingMemory当中查找Fact的方法,在Drools当中查询可分为两种:

一种是不需要外部传入参数;一种是需要外部传入参数

4.4.1.无参数查询

在Drools当中查询以query关键字开始,以end关键字结束,在package当中一个查询要有唯一的名称,查询的内容就是查询的条件部分,条件部分内容的写法与规则的LHS部分写法完全相同

示例:

query"testQuery"

customer:

Customer(age>30,orders.size>10)

end

查询的调用是由StatefulSession完成的,通过调用StatefulSession对象的getQueryResults(StringqueryName)方法实现对查询的调用,该方法的调用会返回一个QueryResults对象,QueryResults是一个类似于Collection接口的集合对象,在它当中存放在若干个QueryResultsRow对象,通过QueryResultsRow可以得到对应的Fact对象,从而实现根据条件对当前WorkingMemory当中Fact对象的查询

4.4.2.参数查询

和函数一样,查询也可以接收外部传入参数

代码示例:

query"testQuery"(int$age,String$gender)

customer:

Customer(age>$age,gender==$gender)

end

4.5.对象定义

在Drools当中,可以定义两种类型的对象:

一种是普通的类型JavaFact的对象;另一种是用来描述Fact对象或其属性的元数据对象。

4.5.1.javaFact对象

在Drools当中是通过向WorkingMemory中插入Fact对象的方式来实现规则引擎与业务数据的交互,对于Fact对象就是普通的具有若干个属性及其对应的getter与setter方法的JavaBean对象。

Drools除了可以接受用户在外部向WorkingMemory当中插入现成的Fact对象,还允许用户在规则文件当中定义一个新的Fact对象,在规则文件当中定义Fact对象要以declare关键字开头,以end关键字结尾,中间部分就是该Fact对象的属性名及其类型等信息的声明。

示例:

declareAddress

city:

String

addressName:

String

end

4.5.2.元数据定义

为Fact对象的属性或者是规则来定义元数据,元数据定义采用的是“@”符号开头,后面是元数据的属性名(属性名可以是任意的),然后是括号,括号当中是该元数据属性对应的具体值

示例:

@author(jacob)

5.DSL

DSL的全称是DomainSpecificLanguage是Drools5当中的一种模版,这个模版可以描述规则当中的条件(LHS部分)或规则当中的条件(RHS部分),这样在使用的时候可以可以在规则当中多处引用这个模版

6.规则流

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 育儿理论经验

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1