认识drools

1、基础api:

1.1 KnowledgeBuilder
KnowledgeBuilder 在业务代码当中收集已经编写好的规则, 然后对这些规则文件进行编译, 最终产生一批编译好的规则包(KnowledgePackage)给其它的应用程序使用
1.2 KnowledgeBase
KnowledgeBase 是 Drools 提供的用来收集应用当中知识(knowledge)定义的知识库对象,在一个KnowledgeBase 当中可以包含普通的规则(rule)、规则流(rule flow)、函数定义(function)、用户自定义对象(type model)等
1.3. StatefulKnowledgeSessions
StatefulKnowledgeSession 对象是一种最常用的与规则引擎进行交互的方式,它可以与规则引擎建立一个持续的交互通道,在推理计算的过程当中可能会多次触发同一数据集
1.4. StateLessKnowledgeSession
StatelessKnowledgeSession 对StatefulKnowledgeSession 做了包装,使得在使用StatelessKnowledgeSession 对象时不需要再调用dispose()方法释放内存资源了

2. FACT对象

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

3. 规则

3.1规则文件
在 Drools 当中,一个标准的规则文件就是一个以“.drl”结尾的文本文件,由于它是一个标准的文本文件,所以可以通过一些记事本工具对其进行打开、查看和编辑。
3.2 规则语言
rule “name”
attributes
when
LHS
Then
RHS
end
3.3 条件部分
条件部分又被称之为Left Hand Side,简称为LHS,下文当中,如果没有特别指出,那么所说的LHS 均指规则的条件部分,在一个规则当中when 与then 中间的部分就是LHS 部分。在LHS 当中,可以包含0~n 个条件,如果LHS 部分没空的话,那么引擎会自动添加一个eval(true)的条件,由于该条件总是返回true,所以LHS 为空的规则总是返回true。LHS 部分是由一个或多个条件组成,条件又称之为pattern(匹配模式),多个pattern之间用可以使用and 或or 来进行连接,同时还可以使用小括号来确定pattern 的优先级。
rule “rule1”
when
c u s t o m e r : C u s t o m e r ( a g e > 20 , g e n d e r = = ’ m a l e ’ ) O r d e r ( c u s t o m e r = = customer:Customer(age>20,gender==’male’) Order(customer== customer:Customer(age>20,gender==male)Order(customer==customer,price>1000)
then

End
此段规则的含义为:的规则就包含两个pattern,第一个pattern 有三个约束,分别是:对象类型必须是Cutomer;同时Cutomer 的age 要大于20 且gender 要是male;第二个pattern 也有三个约束,分别是:对象类型必须是Order,同时Order 对应的Cutomer 必须是前面的那个Customer 且当前这个Order 的price 要大于1000。在这两个pattern 没有符号连接,在Drools当中在pattern 中没有连接符号,那么就用and 来作为默认连接,所以在该规则的LHS 部分中两个pattern 只有都满足了才会返回true。默认情况下,每行可以用“;”来作为结束符(和Java 的结束一样),当然行尾也可以不加“;”结尾。
3.3.1约束连接
可以采用“&&”(and)、“||”(or)和“,”(and)来实现,“&&”(and)、“||”(or)和“,”这三个连接符号如果没有用小括号来显示的定义优先级的话,那么它们的执行顺序是:“&&”(and)、“||”(or)和“,” “&&”优先级最高,表面上看“,”与“&&”具有相同的含义,但是有一点需要注意,“,”与“&&”和“||”不能混合使用,也就是说在有“&&”或“||”出现的LHS 当中,是不可以有“,”连接符出
加粗样式
3.3.2 比较操作符
在当中共提供了十二种类型的比较操作符,分别是:>、>=、<、<=、= =、!=、contains、not contains、memberof、not memberof、matches、not matches;
3.4 结果部分
结果部分又被称之为Right Hand Side,简称为RHS,在一个规则当中then 后面部分就是RHS,只有在LHS 的所有条件都满足时RHS 部分才会执行。
insert:函数insert的作用与外面在Java类调用KieSession对象的insert方法的作用相同,都是用来将一个Fact对象插入到当前的Working Memory当中。使用no-loop true避免死循环
update/modify:pdate/modify用来实现对当前Working Memory当中的Fact进行更新,update宏函数的作用与StatefulSession对象的update方法的作用基本相同,用来告诉当前Working Memory该Fact对象已经发生了变化。只有在RHS部分修改了LHS中作为判断过滤的属性值时,才会重新触发该规则,这是其与insert不同的,也就是说在RHS部分只有更新了LHS中判断逻辑使用到的属性,就会重新触发该规则
delete/retract:
和kession的retract/delete方法一样,宏函数retract/delete也是用来将Working Memory当中某个Fact对象从Working Memory当中删除
3.5 属性部分
3.5.1 salience
用来设置规则执行的优先级,salience 属性的值是一个数字,数字越大执行优先级越高,同时它的值可以是一个负数。默认情况下,规则的ssalience 默认值为0
3.5.2 no-loop
no-loop 属性的作用是用来控制已经执行过的规则在条件再次满足时是否再次执行。默认情况下规则的no-loop属性的值为false,如果no-loop 属性值为true,那么就表示该规则只会被引擎检查一次
3.5.3 date-effective
控制规则只有在到达后才会触发。只有当系统时间>=date-effective 设置的时间值时,规则才会触发执行,否则执行将不执行。在没有设置该属性的情况下,规则随时可以触发,没有这种限制。
3.5.4 date-expires
该属性的作用与date-effective 属性恰恰相反, date-expires 的作用是用来设置规则的有效期。如果date-expires 的值大于系统时间,那么规则就执行,否则就不执行。
3.5.5 enabled
enabled 属性比较简单,它是用来定义一个规则是否可用的。该属性的值是一个布尔值,默认该属性的值为true,表示规则是可用的,如果手工为一个规则添加一个enabled 属性,并且设置其enabled 属性值为false,那么引擎就不会执行该规则。
3.5.6 dialect
该属性用来定义规则当中要使用的语言类型,目前Drools 版本当中支持两种类型的语言:mvel 和java,默认情况下,如果没有手工设置规则的dialect,那么使用的java 语言。
3.5.7 duration
如果设置了该属性,那么规则将在该属性指定的值之后在另外一个线程里触发。该属性对应的值为一个长整型,单位是毫秒。
3.5.8 lock-on-active
确认规则只执行一次。 将lock-on-action 属性的值设置为true,可能避免因某些Fact 对象被修改而使已经执行过的规则再次被激活执行。lock-on-active 是no-loop 的增强版属性。lock-on-active 属性默认值为false。
3.5.9 activation-group
该属性的作用是将若干个规则划分成一个组,用一个字符串来给这个组命名,这样在执行的时候,具有相同activation-group 属性的规则中只要有一个会被执行,其它的规则都将不再执行。
3.5.10 agenda-group
agenda-group 属性的规则的时候需要显示的指定某个Agenda Group 得到Focus(焦点),这样位于该Agenda Group 当中的规则才会触发执行,否则将不执行。
3.5.11 auto-focus
前面我们也提到auto-focus 属性,它的作用是用来在已设置了agenda-group 的规则上设置该规则是否可以自动读取Focus,如果该属性设置为true,那么在引擎执行时,就不需要显示的为某个Agenda Group 设置Focus,否则需要。
3.5.12 ruleflow-group
在使用规则流的时候要用到ruleflow-group 属性,该属性的值为一个字符串,作用是用来将规则划分为一个个的组,然后在规则流当中通过使用ruleflow-group 属性的值,从而使用对应的规则。

4. 函数

函数是定义在规则文件当中一代码块,作用是将在规则文件当中若干个规则都会用到的业务操作封装起来,实现业务代码的复用,减少规则编写的工作量。函数的编写位置可以是规则文件当中package 声明后的任何地方,Drools 当中函数声明。

function void/Object functionName(Type arg...) {
/*函数体的业务代码*/
}

Drools 为我们提供了一个特殊的import 语句:import function,通过该import语句,可以实现将一个Java 类中静态方法引入到一个规则文件当中,使得该文件当中的规则可以像使用普通的Drools 函数一样来使用Java 类中某个静态方法。

import function test.RuleTools.printInfo;

调用方式:

RuleTools.printInfo(...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值