Drools规则引擎技术指南
2020-09-02 16:47:58 168 举报
AI智能生成
登录查看完整内容
Drools规则引擎技术指南读书笔记
作者其他创作
大纲/内容
Drools规则引擎技术指南
概述
KIE
Knowledge Is Everything知识就是一切
KIE主要模块
OptaPlanner
本地搜索和优化工具
Drools
UberFire
类似于Eclipse
jBPM
业务流程管理
为什么要用规则引擎
业务规则和代码分离
入门实例
相关文件
hello.drl
package
对于规则文件中规则的管理是逻辑上管理,不管理规则文件的物理牡蛎
同一个规则库下逻辑目录中的规则文件是唯一的
import
用来导入类或者静态方法
rule
LHS
RHS
kmodule.xml
必须放到src/main/resources/META-INF/文件夹下面
KieBase
可以配置多个KieBase,name属性不能重名
packages属性,字符串形式的路径,resources目录下的文件夹名称,可同时定义多个包,用逗号进行分隔
KieSession
pom.xml
Hello.java
Fact对象
规则中更新Fact对象,改变的是对象的引用,调用updte后,才会真正改变Fact
疑问:引用不就是对象本身吗?
Kiesession状态
无状态
Drools的工作内存中不保存数据,在规则执行时将数据通过参数传递,数据类型可以为对象或集合
execute()调用
有状态
默认创建有状态,如果需要清理状态,调用dispose方法
fireAllRules() 调用
多线程
默认关闭,当前还在试验阶段
基础语法
pattern匹配模式
LHS部分有1个或者多个条件组成,条件又称为pattern
绑定变量既可以用在对象上,也可以用在对象的属性上
约束连接
contains
Fact对象的某个属性值是否包含一个指定的对象值
memberOf
Fact对象的某个属性值是否在1个或者多个集合中
List
Set
Map
比较的是Map的key
matches
Fact对象的某个属性值和标准Java正则表达式进行相似匹配
soundslike
Fact对象的某个属性值与给定值是否有相同的英语发音
str[startsWith|endsWith|length]
以什么开头、以什么结尾、字符串长度
in/not in
和sql语句的in类似
eval
尽量少使用,会导致规则引擎的性能问题
not
判断在工作内存中是否不存在某个值
exists
和not相反,在工作内存中存在某个值
forall
和eval功能类似,所有匹配的值都满足条件
from
用户可以指定任意的资源,用于LHS部门的数据匹配
用来对集合进行遍历
用来对Java服务进行访问并就结果进行遍历
collect
和from一起使用,from collect,用来汇总的。
accumulate
内置功能,包括average平均值、min最小值、max最大值、count统计、sum求和、collectList返回list、collectSet返回HashSet
accumute的函数可以自定义,自定义的名称如何是min和sum等,不会对原方法进行重写
reverse code
数据更新后,将会再次执行累计操作,在执行累计操作之前的回滚操作
语法扩展
list[1] 和 list.get(1) 是相同的
list[1] 只能在LHS使用
list.get(1) 只能在RHS使用
set().iterator().next
只能在RHS使用
map.get(key)和getMap().get(\"key”)是相同的
map.get(key)只能在LHS使用
getMap().get(\"key”)只能在RHS使用
RHS语法
更新事实对象
尽量保持最小操作,主要插入、删除或者修改工作内存数据(Fact对象)
update
update(Fact事实对象)
insert
insertLogical
与insert类似,没有更多的事实来支持当前触发规则的LHS部分时,该Fact事实对象被自动删除,使用场景不多
delete
通过引用LHS部分上绑定的值
modify
结构化的方法更新事实对象
操作
drools.halt()
立即中止规则执行
drools.getWokingMemory()
返回WorkingMemory对象
drools.setFocus(String s)
将焦点放在指定的议程组上
drools.getRule().getName()
返回规则的名称
drools.getTuple()
注释
//单行注释
/**/多行注释
规则属性
no-loop
防止死循环,默认值为false
被修改的事实对象与规则LHS部分的约束关系是包含关系,就会导致规则重新被激活和匹配
即使设置了属性,还是有死循环的风险
一个规则文件中定义了两个规则,规则A匹配属性b,修改属性a,规则B匹配属性a,修改属性b
ruleflow-group
lock-on-active
规则只触发一次
salience
设置规则执行顺序,值越大,执行顺序越高,排名越靠前
enabled
规则是否可以被执行,默认值为true
dialect
定义规则中要使用的语言类型,可能是Java或者Mvel
date-effective
规则的生效时间
date-expires
失效时间
activation-group
激活分组,具有相同名称的规则体有且只有一个规则被激活
执行规则的顺序收到salience影响
agenda-group
获取焦点的规则才会被激活
和activation-group互相影响
auto-focus
自动获取焦点?
timer
设置1:设置延时时间、重复周期
设置2:设置cron
中级语法
global全局变量
值变化不会影响到规则的再次激活
如果多个package使用相同标识声明的全局变量,那么类型必须是相同的。
类型为常量或者包装类型,修改gobal值只影响代签的规则代码,规则内部修改不影响全局。
定位为集合类或者JavaBean时,在规则体RHS部门中修改修改,则规则库或Java代码中的值都会发生变化。
全局变量的使用场景是什么?
query查询
在drl中定义查询,在代码中可以通过getQueryResults获取查询结果
查询支持输入参数
fuction函数
通过import,引入Java的静态方法
在规则中直接定义,添加关键字function
在同一个逻辑路径package下函数是全局的,在不同的逻辑路径下函数不可使用
可以在when中使用fuction,但是不能单独使用,需要使用eval判断返回值
declare
声明新类型
可以省掉创建JavaBean文件。
如果规则文件中声明的类型和import引入的类名相同,系统会报错
声明时可以通过extends关键字进行继承
声明元数据类型
一般用于查询、复杂事件处理和属性字段约束居多
规则继承
LHS条件继承,RHS动作不继承
条件原始do对应多个then条件
维护困难,不推荐使用
指定规则名调用
可以指定规则的最大数量
可以指定规则名
可以两者都指定
KieSession状态
高级用法
决策表
DSL领域语言
规则模板
规则流
规则+流程编排,讲规则执行放到流程编排中
Drools事件监听
RuleRuntimeEventListener
规则运行时监控,监听的是insert、update、delete的操作
AgendaEventListener
议程事项监听
ProcessEventListener
流程事项监听
Workbench
是一个Web-IDE,可视化的规则编辑器
WorkBench是面向技术人员的配置IDE,但是我们需要的是面向业务人员的IDE
Space ->软件包-> 单个drl资产
动态规则
不重启服务器的前提下使业务规则发生变化,并且不影响服务器的正常使用,从而实现动态业务变化的规则
KieContainer
KieContainer就是一个KieBase容器
一个知识仓库,包含了若干的规则、流程、方法等。
不包含运行时数据,如果需要运行规则,需要创建KieSession
包含运行时数据,包含事实Fact
是规则引擎和应用程序进行交互的会话通道
创建成本比较低,不需要缓存,KieBase需要缓存
扩展说明
语法优化
规则拆分原则:讲规则进行拆分,避免出现OR
规则比较原则:讲区间或者模糊查询的方式排在比较值的后面
规则简单原则:尽量避免出现过于负责的比较值
规则结果原则:then中避免出来if else
规则库创建
进程中第一次创建需要1300ms
KieBase是规则库,只存活在当前进程中
KieBase是不可被序列化、反序列化的,无法放在缓存中
规则实战
规则管理系统
规则业务系统
集群
和管理系统通过消息队列
业务测试场景
规则发布时进行规则的验证,只测试业务逻辑合理性
0 条评论
回复 删除
下一页