Drools源码粗略研究

上传人:ji****72 文档编号:45848144 上传时间:2018-06-19 格式:PDF 页数:27 大小:826.67KB
返回 下载 相关 举报
Drools源码粗略研究_第1页
第1页 / 共27页
Drools源码粗略研究_第2页
第2页 / 共27页
Drools源码粗略研究_第3页
第3页 / 共27页
Drools源码粗略研究_第4页
第4页 / 共27页
Drools源码粗略研究_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《Drools源码粗略研究》由会员分享,可在线阅读,更多相关《Drools源码粗略研究(27页珍藏版)》请在金锄头文库上搜索。

1、Drools 5源码初浅研究 吴超凡 云南大学 理解规则引擎 1.规则引擎可以被看做具有推理能力的计算机程序,推理是基于事实 和规则的,因此需要两个要件:事实的集合(事实可被看成由类的实 例封装成),规则的集合。 2.规则:在规则引擎中,一条规则由条件和结论两部分组成,可以理 解为 if(条件1)结论1 这样的代码。 3.规则集:规则的集合。 4.事实与规则的匹配以及冲突集,当一个事实满足某条规则的条件部 分,就说这个事实与这条规则匹配。如某条规则是:如果有个人数学 成绩60分以上的话,就给他奖学金;某个事实是:我。 理解规则引擎 现在看“我”是如何跟这个规则匹配的,因为“我”的数学成绩是75

2、 分,所以满足条件部分。“我”就满足“获得奖学金”这条规则。剩 下就等发给我奖学金这个操作了,由于获得奖学金的实体不只我一个, 成绩好的要先发,因此操作有个先后顺序,因此要把这个匹配项先存 入冲突集中,判断先给谁发奖学金(也就是执行的先后顺序)。 5.规则引擎运作原理: S1 使用匹配算法如Rete算法从事实集中取出事实与规则匹配,如果发生 匹配,则把这个匹配项存入冲突集。 S2 重复S1直到没有匹配项。否则停止匹配。 S3 执行冲突集。 以上5点是我个人的理解 Drools 5 JSR-94 Drools历史 Drools源码探究 JSR-94 JSR-94是Java规则引擎API的Java

3、规范请求。它由Java Community Process (JCP)制定。定义了规则引擎的Java运行 时API,使规则引擎可以通过简单的API被Java平台访问。 这个标准提供了JSR-94的综览和如何让商业规则技术和 Java应用程序结合运行。同时它也提供了开发基于规则的 应用程序的示例代码。(摘自维基百科) JSR-94并不规定一定要用Rete算法来实现规则引擎。 Drools 历史 Drools项目开始于2001年,由Bob McWhirter发起,并于当 年在SF.net上注册为开源代码。Drools 1.0版本从来没有公 布过,因为它的事实规则的匹配算法是靠线性的穷举 算法的,后

4、来2.0版本采用了Rete算法,并且项目被转移到 Codehaus。在Drools 2.0的开发周期中,Nobi Y成为项目负 责人。此后此项目在java规则引擎开源代码中一直处于领 先地位,并开始为商业提供服务。在2005年10月被并入 JBoss项目中,成为Jboss Rules。因此Drools现在也叫Jboss Rules。另外Drools遵循JSR-94规范。 Drools 5 源码探究 获取源码:可以从官网上获取源码, http:/www.jboss.org/drools/ 源码示例:见右图,粗略估计大约有800左右个类跟接口 Drools 5 源码探究 调通一个实例:由于我下载的

5、源码版本可能不是最新的,在JDK1.7环 境运行会报版本错误,简单修改源码后竟然调通了。 Drools源码探究 实例 实例源码 Drl文件 运行结果 继续前进,外围API探究 从那个最简单Demo看,Drools最外层的类(接口) 至少有KnowledgeBuilder,KnowledgeBuilderFactory, KnowledgeBase,KnowledgeBaseFactory, KnowledgeBuilderErrors(错误类先不管), KnowledgeRuntimeLogger, StatefulKnowledgeSession等。 工厂模式 经观察,大部分的外层的类(比如

6、 KnowledgeBuilder, KnowledgeBase)的实例 的创建都是使用工厂模式来创建。 工厂模式 Resource接口 Resource接口 功能:提供源规则(文件或流或URL)的访 问方法; Resource接口有多个实现类。 一个完整的Demo构成 包的构建 知识库构建 获取KnowledgeSession, KnowledgeSession是用来操作规则 引擎的类,分StatefulKnowledgeSession和 StatelessKnowledgeSession,这个类相当于规则引擎的遥控 器,它直接与KnowledgeBase交互,因此这两个类是相互 记忆的。

7、包的构建 包(Package)对应一个规则文件,包需要使用包构建器来构 建,即PackageBuilder类。这里提的规则文件需要注意, Drools不只使用由规则语言编写的Drl文件,还可以是其他 类型的包括XML,XML的规则文件具体怎么样还有待进一 步研究。构建一个Package,也就是把源规则集内容(比如 drl)经过编译(Drools有drl编译器)生成一棵庞大的对象 树,以及一系列描述性的对象,并被封装到Package对象中。 包的构建 在Demo中有这么一行代码 kbuilder.add(ResourceFactory.newClassPathResource(“Sample.d

8、rl“), ResourceType.DRL); KnowledgeBuilder中添加了一个drl文件相关的Resource ResourceFactory.newClassPathResource(“sample.drl”)构建了一个 ClassPathResource对象,其实还支持其他的访问方式,比如UrlResource当 提供URL访问方式时,就要用这个类;FileResource文件,当规则集存在 文件中时使用;还有ByteArrayResource,InputStreamResource等。总之 Resource仅仅是定义了源规则的访问方式。 KnowledgeBuilderI

9、mpl 内部有PackageBuilder类型的pkgBuilder属性, Resource被转交给了pkgBuilder处理。 包的构建也就从这里开始。 包的构建 如何由一个Resource实例构建包? 包的构建 包的构建是十分复杂的过程。在Parser中其 实应用了一个使用Antlr编写的规则语言编 译器(Antlr是java的开源的词法分析器软件), 从而把由文本表达的规则文件编译成规则 集对象。 知识库构建 知识库对象KnowldegeBase使用工厂模式创 建,KnowledgeBase内有RuleBase属性, RuleBase内包含有Package。KnowldegeBase 使

10、用getKnowledegePackage(Package pkg)方 法获取到Package对象,并添加到RuleBase 内。 RuleBase接口的实现类ReteooRuleBase(还没 详细研究) 获取KnowledgeSession KnowledgeSession分StatefulKnowledgeSession和 StatelessKnowledegSession,分别表示有状态的控制台和无 状态的控制台。它们的区别还没研究过,一般用 StatefulKnowledgeSession就够了。获取 StatefulKnowledgeSession非常容易 使用KnowledgeB

11、ase.getStatefulKnowledgeSession()方法获取。 剖析StatefulKnowledgeSession的实现类 StatefulKnowledgeSessionImpl: 属性 可见StatefulKnowledgeSession是通过记忆创建它的 KnowledgeBase对象来对KnowledgeBase进行操作的,这里 还引出了一个重要的类(接口)ReteooWorkingMemory。 StatefulKnowledgeSession ReteooWorkingMemory session属性暂时还没具体研究。可以知道的 是这个属性实例是在KnowledgeBase中由RuleBase ruleBase属性来创建 的。 大量的方法都是对ReteooWorkingMemory session属性进行操作的(暂 不管) StatefulKnowledgeSession fireAllRules()方法:这个方法是执行冲突集 中的所有结论。也就是最终能产生输出的 方法。 结论 觉得还有很多东西还是没弄清楚,所以就 没有拿出来share了,这个ppt基本上只展示 了外层的源码,RuleBase, ReteooWorkingMemory,及其两者之间的匹 配算法Rete算法的实现,还有Agenda(冲突 集)的运行原理还需要研究。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号