没有合适的资源?快使用搜索试试~ 我知道了~
首页Drools 6.4中文教程:企业级规则引擎与KIE API应用
Drools中文文档提供了关于Drools规则引擎的深入介绍,这是一个开源的企业级业务规则管理系统,由JBoss开发并纳入其应用服务器。Drools的核心是基于Java的RETE算法,这是一种高效的规则匹配算法,它允许业务规则以自然的面向对象方式表达,提高了规则编写和维护的便利性。 在Drools 6.4版本中,规则被设计成易于部署的jar包形式,通过KIE (Knowledge Is Everything) 概念,开发者能够通过kie-ci动态从Maven仓库加载规则库,这显著降低了规则管理的复杂性,增强了系统的灵活性。这种设计允许在不修改代码的情况下,通过引入不同版本的jar包实现规则的实时更新,使得业务策略的修改和调整变得更加简单,且对业务经理开放,提升了系统的响应速度和适应性。 规则引擎的核心功能在于将业务决策逻辑从应用程序代码中分离出来,通过解析规则文件,它接受输入数据,解析规则集,并根据规则做出决策。这种方式有助于减少代码的冗余,提高代码的可维护性和可读性,使得业务分析师和审计人员能更好地理解和检查规则的执行情况。 Drools 6.5版本相比6.4版进行了优化,但具体细节未在提供的部分详述。Drools是一个强大的工具,它不仅提升了规则的开发效率,也促进了业务流程的灵活性和敏捷性,使得企业在面对不断变化的需求时能够快速响应。 对于Java工程师来说,掌握Drools意味着能够利用它构建智能的应用程序,实现自动化决策和业务规则管理,提升软件的业务价值。无论是规则的编写、部署还是规则库的管理,Drools都提供了一种标准化和模块化的解决方案,使得整个开发过程更加高效和专业。
资源详情
资源推荐
[source code]
public KieSession newKieSession(String kSessionName, Environment
environment, KieSessionConfiguration conf) {
//传入的 environment、conf 都是 null。KieSessionConfiguration 用法在 Drools6
新特性中有提到过。
KieSessionModelImpl kSessionModel = (KieSessionModelImpl)
getKieSessionModel(kSessionName);
//DO1 验证是否找到相应的 Model
//DO2 验证生成 Model 是否是 StateFul,默认生成的 KieSession 都是 stateFul
//DO3 找到相应的 KieBase
//DO4 根绝 KieBase 以及 KSessionModel 生成相应的 KieSession
//DO5 放入一个存储有状态的 KieSession 的 Map,之后可以在需要的时候先从
Map 里面找。
}
下面就是插入值
ksession.insert( message );
[source code]
public FactHandle insert(final Object object) {
return insert( object, /* Not-Dynamic */
null,false,false,null,null );
}
[source code]
public FactHandle insert(final Object object,final Object tmsValue,final boolean
dynamic,boolean logical,final RuleImpl rule,final Activation activation) {
checkAlive();
return this.defaultEntryPoint.insert( object,
tmsValue,dynamic,logical,rule,activation );
}
Drools6.4 版本关于 session 的不同方法
小编为什么会要将 session 独立出来一个章节呢,这是有原因的,我们在开发过程会遇到各
种情况,这个 session 的状态是很重要的,也会在开发中经常使用。
KieSession 用于与规则引擎进行交互的会话。
会话分为两类:
⚫ 有状态的 KieSession
⚫ 无状态的 StatelessKieSession
KieSession 有状态的
KieSession 会在多次与规则引擎进行交互中,维护会话的状态。
定义 KieSession,在
kmodule.xml
文件中定义 type 为 stateful 的 session:
<ksession name="stateful_session" type="stateful"></ksession>
注意:stateful 是 type 属性的默认值。
获取 KieSession 实例
KieSession statefulSession = kieContainer.newKieSession("stateful_session");
接下来,可以在 KieSession 执行一些操作。最后,如果需要清理 KieSession 维护的状态,
调用 dispose()方法。
StatelessKIESession
与 KieSession 相反,StatelessKIESession 隔离了每次与规则引擎的交互,不会维护会话
的状态。
如果将 session 比作编程语言中的函数,StatelessKIESession 就是无副作用的函数。
StatelessKIESession 适用场景:
数据校验
运算
数据过滤
消息路由
任何能被描述成函数或公式的规则
定义 StatelessKIESession,在
kmodule.xml
文件中定义 type 为 stateless 的 session:
<ksession name="stateless_session" type="stateless"></ksession>
如果我们想要用无状态的 kie-session 的话 就必须这样定义了。
获取 StatelessKIESession 实例:
StatelessKieSession statelessKieSession =
kieContainer.newStatelessKieSession("stateless_session");
//通过 KieServices 获取 command 工厂类 KieCommands:
KieCommands commandFactory = kieServices.getCommands();
//可以使用工程类 KieCommands 调用 newXXXCommand 开头的方法创建 command 实例。
//会话执行 command:
statelessKieSession.execute(command);
//----------------------- 分隔线-----------------------
[source code] 调用的是该接口
public interface StatelessRuleSession {
void execute(java.lang.Object o);
void execute(java.lang.Iterable iterable);
}
StatelessKnowledgeSessionImpl 实现类
public void execute(Object object) {
StatefulKnowledgeSession ksession = newWorkingMemory();
try {
ksession.insert( object );
ksession.fireAllRules();
} finally {
dispose(ksession);
}
}
从代码中我们可以看出来,也是通过 finally 中的 dispose 方法来删除的,只是与
kieSession 方式不同。
Drools 内部功能详细介绍
规则文件
在 Drools 当中,一个标准的规则文件就是一个以“.drl”结尾的文本文件,由于它是
一个标准的文本文件,所以可以通过一些记事本工具对其进行打开、查看和编辑。规则是放
在规则文件当中的,一个规则文件可以存放多个规则,除此之外,在规则文件当中还可以存
放用户自定义的函数、数据对象及自定义查询等相关在规则当中可能会用到的一些对象。
一个标准的规则文件的结构代码清单:
除 package 之外,其它对象在规则文件中的顺序是任意的,也就是说在规则文件当中必
须要有一个 package 声明,同时 package 声明必须要放在规则文件的第一行,规则文件当
中的 package 和 Java 语言当中的 package 有相似之处,但不完全相同。在 Java 当中 package
的作用是用来对功能相似或相关的文件放在同一个 package 下进行管理,这种 package 管理
既有物理上 Java 文件位置的管理也有逻辑上的文件位置的管理,在 Java 当中这种通过
package 管理文件要求在文件位置在逻辑上与物理上要保持一致;但在 Drools 的规则文件
当中 package 对于规则文件中规则的管理只限于逻辑上的管理,而不管其在物理上的位置
如何,这点是规则与 Java 文件的 package 的区别。
对于同一 package 下的用户自定义函数、自定义的查询等,不管这些函数与查询是否在
同一个规则文件里面,在规则里面是可以直接使用的,这点和 Java 的同一 package 里的
Java 类调用是一样的。
规则语言
一个规则可以包含三个部分:唯有 attributes 部分是可选的,其他都是必填信息:
定义当前规则执行的一些属性等,比如是否可被重复执行、过期时间、生效时间等
条件部分:
即 LHS,定义当前规则的条件,如 when Message(); 判断当前 workingMemory 中是否存
在 Message 对象。
结果部分:
即 RHS,这里可以写普通 java 代码,即当前规则条件满足后执行的操作,可以直接调
用 Fact 对象的方法来操作应用
条件部分:
条件部分又被称之为 Left Hand Side,简称为 LHS,下文当中,如果没有特别指出,
那么所说的 LHS 均指规则的条件部分,在一个规则当中 when 与 then 中间的部分就是
LHS 部分。在 LHS 当中,可以包含 0~n 个条件,如果 LHS 部分没空的话,那么引擎会自
动添加一 个 eval(true)的条件,由于该条件总是返回 true,所以 LHS 为空的规则总是返
回 true。
LHS 部分是由一个或多个条件组成,条件又称之为 pattern(匹配模式),多个 pattern 之
间用可以使用 and 或 or 来进行连接,同时还可以使用小括号来确定 pattern 的优先级
对于一个 pattern 来说“绑定变量名”是可选的,如果在当前规则的 LHS 部分的其它的
pattern 要用到这个对象,那么可以通过为该对象设定一个绑定变量名来实现对其引用,对
于绑定变量的命名,通常的作法是为其添加一个“$”符号作为前缀,这样可以很好的与 Fact
的属性区别开来;绑定变量不仅可以用在对象上,也可以用在对象的属性上面,命名方法与
对象的命名方法相同;“field 约束”是指当前对象里相关字段的条件限制,
规则中 LHS 部分单个 pattern (模式) 的情形。
规则中“$customer”是就是一个绑定到 Customer 对象的“绑定变量名”,该规则的 LHS 部
分表示,要求 Fact 对象必须是 Customer 类型,该条件满足了那么它的 LHS 会返回 true。
下面这种写法就是包含两种 pattern(模式) :
rule "rule1"
when
$customer:Customer(age>20,gender=='male')
Order(customer==$customer,price>1000)
then
....
end
简单说明一下上面的代码
第一个:pattern(模式) 有三个约束
1、 对象 类型必须是 Cutomer;
2、Cutomer 的 age 要大于 20
3、Cutomer 的 gender 要是 male
第二个:pattern(模式) 有三个约束
1、 对象类型必须是 Order;
2、 Order 对应的 Cutomer 必须是前面的那个 Customer
3、 当前这个 Order 的 price 要大于 1000
这两个 pattern 没有符号连接,在 Drools 当中在 pattern 中没有连接符号,那么就用
and 来作为默认连接,所以在该规则的 LHS 部分 中两个 pattern(模式)只有都满足了才会
返回 true。默认情况下,每行可以用“;”来作为结束符(和 Java 的结束一样),当然行
尾也可以不加“;”结尾。
约束连接
对于对象内部的多个约束的连接,可以采用“&&”(and)、“||”(or)和“,”(and)来实
现
这三个连接符号如果没有用小括号来显示的定义优先级的话,那么它们的执行顺序是:“&&”
(and)、“||”(or)
表面上看“,”与“&&”具有相同的含义,但是有一点需要注意,“,”与“&&”和“||” 不
能混合使用,也就是说在有“&&”或“||”出现的 LHS 当中,是不可以有“,”连接符出
现的,反之亦然
剩余220页未读,继续阅读
Cx_轩
- 粉丝: 95
- 资源: 16
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- JDK 17 Linux版本压缩包解压与安装指南
- C++/Qt飞行模拟器教员控制台系统源码发布
- TensorFlow深度学习实践:CNN在MNIST数据集上的应用
- 鸿蒙驱动HCIA资料整理-培训教材与开发者指南
- 凯撒Java版SaaS OA协同办公软件v2.0特性解析
- AutoCAD二次开发中文指南下载 - C#编程深入解析
- C语言冒泡排序算法实现详解
- Pointofix截屏:轻松实现高效截图体验
- Matlab实现SVM数据分类与预测教程
- 基于JSP+SQL的网站流量统计管理系统设计与实现
- C语言实现删除字符中重复项的方法与技巧
- e-sqlcipher.dll动态链接库的作用与应用
- 浙江工业大学自考网站开发与继续教育官网模板设计
- STM32 103C8T6 OLED 显示程序实现指南
- 高效压缩技术:删除重复字符压缩包
- JSP+SQL智能交通管理系统:违章处理与交通效率提升
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功