一、规则引擎Droolsjava
- 具备一个易于访问企业策略
- 易于调整以及易于管理的开源业务规则引擎
- 符合业内标准,速度快、效率高
- Drools是一个基于java的规则引擎,开源的
- 能够将复杂多变的规则从硬编码中解放出来
- 以规则脚本的形式存放在文件中
- 使得规则的变动不须要修正代码重启机器就能够当即在线上环境生效
二、KnowledgeBuilderless
- 用来在业务代码当中收集已经编写好的规则
- 对这些规则文件进行编译
- 最终产生一批编译好的规则包(KnowledgePackage)给其它的应用程序使用
- hasErrors()方法获得编译规则过程当中发现规则是否有错误
KnowledgeBuilder kbuilder=KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("test.drl", Test.class),ResourceType.DRL);
if(kbuilder.hasErrors()){
System.out.println("规则中存在错误,错误消息以下:");
KnowledgeBuilderErrors kbuidlerErrors=kbuilder.getErrors();
for(Iterator iter=kbuidlerErrors.iterator();iter.hasNext();){
System.out.println(iter.next());
}
}
Collection<KnowledgePackage> kpackage=kbuilder.getKnowledgePackages();//产生规则包的集合
三、KnowledgeBaseide
- Drools 提供的用来收集应用当中知识(knowledge)定义的知识库对象
- 能够包含普通的规则(rule)、规则流(rule flow)、函数定义(function)、用户自定义对象(type model)等
KnowledgeBase kbase=KnowledgeBaseFactory.newKnowledgeBase();
- 带配置KnowledgeBaseConfiguration
KnowledgeBaseConfiguration kbConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
kbConf.setProperty( "org.drools.sequential", "true");
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kbConf);
四、StatefulKnowledgeSession函数
- 规则编译完成以后,接下来就须要使用一个 API 使编译好的规则包文件在规则引擎当中运行起来
- Drools5 当中提供了两个对象与规则引擎进行交互:StatefulKnowledgeSession和 StatelessKnowledgeSession
StatefulKnowledgeSession statefulKSession=kbase.newStatefulKnowledgeSession();
statefulKSession.setGlobal("globalTest", new Object());//设置一个global对象
statefulKSession.insert(new Object());//插入一个fact对象
statefulKSession.fireAllRules();
statefulKSession.dispose();
- StatefulKnowledgeSession 将规则当中须要使用的 fact 对象插入进去
- 将规则当中须要用到的 global 设置进去
- 调用 fireAllRules()方法触发全部的规则执行
- 调用 dispose()方法将内存资源释放。
五、StatelessKnowledgeSession工具
- 与 StatefulKnowledgeSession 相仿,用来接收业务数据、执行规则的
- 对 StatefulKnowledgeSession 作了包装
- 在使用 StatelessKnowledgeSession 对象时不须要再调用 dispose()方法释放内存资源
StatelessKnowledgeSession statelessKSession=kbase.newStatelessKnowledgeSession();
ArrayList list=new ArrayList();
list.add(new Object());
list.add(new Object());
statelessKSession.execute(list);
六、Fact 对象oop
- 将一个普通的JavaBean插入到规则的WorkingMemory当中后的对象
- 规则能够对 Fact 对象进行任意的读写操做
- 当一个 JavaBean 插入到WorkingMemory 当中变成 Fact 以后
- Fact 对象不是对原来的 JavaBean 对象进行 Clon,而是原来 JavaBean 对象的引用
七、规则ui
(1)规则文件编码
- 一个标准的规则文件就是一个以“.drl”结尾的文本文件
- 一个标准的文本文件,因此能够经过一些记事本工具对其进行打开、查看和编辑
- 规则是放在规则文件当中的,一个规则文件能够存放多个规则
- 规则文件当中还能够存放用户自定义的函数、数据对象及自定义查询等相关在规则当中可能会用到的一些对象
- 一个标准的规则文件的结构代码清单以下:

- package 是对于规则文件中规则的管理只限于逻辑上的管理,而无论其在物理上的位置如何
(2)规则语言code
- 规则是在规则文件当中编写
- 要编写一个规则首先须要先建立一个存放规则的规则文件
- 一个规则文件能够存放若干个规则
- 每个规则经过规则名称来进行标识
- 一个标准规则的结构:

- 一个规则一般包括三个部分:属性部分(attribute)、条件部分(LHS)和结果部分(RHS)
- 三个部分都是可选的
(3)条件部分又被称之为 Left Hand Side,简称为 LHS对象
- 由一个或多个条件组成,条件又称之为 pattern(匹配模式)
- 多个 pattern之间用可使用 and 或 or 来进行链接
- 同时还可使用小括号来肯定 pattern 的优先级
- 多个约束的链接,能够采用“&&”(and)、“||”(or)和“,”(and)来实现
- “,”与“&&”和“||”不能混合使用
- 十二种类型的比较操做符
- 分别是:>、>=、<、<=、= =、!=、contains、not contains、memberof、not memberof、matches、not matches
(4)结果部分又被称之为 Right Hand Side,简称为 RHS
- 在 RHS 里面,提供了一些对当前 Working Memory 实现快速操做的宏宏函数或对象
- 好比 insert/insertLogical、update 和 retract 就能够实现对当前 Working Memory中的 Fact 对象进行新增、删除或者是修改
(5)规则的属性共有 13 个
- 分别是:activation-group、agenda-group、auto-focus、date-effective、date-expires、dialect、
- duration、enabled、lock-on-active、no-loop、ruleflow-group、salience、when
(6)函数是定义在规则文件当中一代码块
- 做用是将在规则文件当中若干个规则都会用到的业务操做封装起来,实现业务代码的复用,减小规则编写的工做量
function void/Object functionName(Type arg...) {
/*函数体的业务代码*/
}
- 业务代码的书写采用的是标准的 Java 语法
- 没有可见范围的设定,而 Java 当中能够经过 public、private 之类来设置方法的可见范围
(7)查询是 Drools 当中提供的一种根据条件在当前的 WorkingMemory 当中查找 Fact 的方法
- 在 Drools 当中查询可分为两种:一种是不须要外部传入参数;一种是须要外部传入参数
无参数查询
- 查询以 query 关键字开始,以 end 关键字结束
- 在 package 当中一个查询要有惟一的名称
- 查询的内容就是查询的条件部分
- 条件部份内容的写法与规则的 LHS 部分写法彻底相同
//调用查询
QueryResults queryResults=statefulSession.getQueryResults("testQuery");
for(QueryResultsRow qr:queryResults){
Customer cus=(Customer)qr.get("customer");
//打印查询结果
System.out.println("customer name :"+cus.getName());
}
statefulSession.dispose();
参数查询
- 和不带参数的查询相比,惟一不一样以外就是在查询名称后面多了一个用括号括起来的输入参数
- 查询可接收多个参数,多个参数之间用“,”分隔,每一个参数都要有对应的类型声明
(8)对象定义
- 能够定义两种类型的对象:一种是普通的类型 Java Fact 的对象;另外一种是用来描述 Fact 对象或其属性的元数据对象
Fact 对象定义
declare Address
city : String
addressName : String
end
元数据定义
- 采用的是“@”符号开头,后面是元数据的属性名(属性名能够是任意的)
- 而后是括号,括号当中是该元数据属性对应的具体值(值是任意的)