Posted on 2010-03-10 21:43
断点 阅读(510)
评论(0) 编辑 收藏 所属分类:
Drools
1、Drools是什么?
Drools 是一个基于Charles Forgy's的Rete算法的,专为Java语言所设计的规则引擎。Rete算法应用于面向对象的接口将使基于商业对象的商业规则的表达更为自然。Drools是用Java写的,但能同时运行在Java和.Net上。
一路到底的框架:
大多数开发者都有自己喜爱的框架。无特定顺序,它们包括表现层框架(Struts, JSF, Cocoon和Spring),持久化框架(JDO, Hibernate, Cayenne and Entity Beans)以及结构框架(EJB, 又是Spring, Pico和Excalibur), 还有其它很多。每种框架都各有所长,给开发者提供子许多“即开即用”的功能。使用框架来部署应用意味着你避免了许多让人厌烦的细节,让你集中注意力到关键之处。
到目前为直,在框架所能做的事中仍然有一个缺口,那就是商业逻辑没有框架。像EJB和Spring这样的工具虽好,但它们却几乎没有提及怎么组织你的那些if …then语句。把Drools加到你的开发工具箱中意味着现在你可以“一路到底”的使用框架来构建你的应用程序。
2.Drools4.0版本:
JBoss Drools是一款开源的业务规则引擎,目前已经发布了4.0版本。在4.0版本中主要的特色和改进如下:
1.更高的性能:较之于之前的版本,Drools 4.0更为高效并且占用更少的内存空间。内部的性能测试表明,性能的提升已经从几分钟缩减为若干秒钟。
2.提升的表达能力:当前的发布版引入了更为强大且的业务行为脚本语言(MVFlex表达式语言)。
3.友好的业务分析工具:一个具备向导功能的规则编辑器的增加,使得非程序员用户可以设计复杂的业务规则,并在没有编写任何代码的情况下自动绑定企业数据。提供带有菜单提示和下拉列表的向导来帮助用户完成设计过程。
4.规则流的能力:可视化的建模技术可以使用户声明式地为相应规则的执行路径建立访问模型。它同样还允许在单个工作内存中存在多个并发工作流,并根据控制典型的业务处理过程的需求,从根本上组织规则的执行。 5.多应用支撑:对于有状态和无状态处理过程增强的支持以及全面的线程安全性,辅助Drools更轻易的嵌入在Java平台,JavaEE以及面向服务的商业应用之中。
6.直接可和Hibernate集成:用户可以直接在Hibernate驱动的RDBMS查询中对数据(facts)进行判断。现有的Hibernate组件可以直接用在规则引擎里,减少编码的工作量。
7.为非程序员设计的BRMS:从技术角度来看,新的BRMS基于Web开发,使用AJAX呈现,便于协作,是一个编写、版本化控制和管理规则的系统。业务分析师目前可以交互式的授权或修改自动转换的规则。管理员目前具备完全的生命周期控制能力,包含何种规则在QA阶段,分段(staging),以及实施(production)阶段等等。
3.Drools的总体架构:
我们使用Drools就是为了让它处理数据与规则的关系,因此Drools要获得数据和获得规则,然后进行执行。因此Drools分为编制和运行时两个部分。
编制是指产生rule的过程,Drools用DRL,或者XML来描述规则。编制的过程包括为规则建立DRL 或XML 文件,传入一个由Antlr 3 文法器定义的解析器中。解析器对文件中规则文法的正确性进行检查并为descr 建立一个中间结构,在AST 中的descr 代表规则的描述。AST 然后将descr 传入Package Builder中,由其进行打包。Package Builder 同时负责包括打包中用到的所有代码产生器和编译器。Package 对象是自包含并可配置的,它是一个包含规则的序列化的对象。
RuleBase 是运行时组件,包含一个或多个Package。Package 在任何时候都可以向RuleBase中添加或删除。一个RuleBase 可以同时初始化多个Working Memory,在其间维护着一个弱引用,除非重新进行配置。Working Memory 包含许多子组件,如Working Memory Event Support(事件支持),Truth Maintenance System(真值维护系统), Agenda 和 Agenda Event Support(事件支持)。向Working Memory 中设置对象的工作可能要在建立了一个或多个激活的规则后才结束。Agenda 负有规划激活规则运行的责任。
4.Drools主要有以下类实现:
编制:
XmlParser,DrlParser 分别用来解析XML描述的规则文件和DRL描述的规则文件。
PackageBuilder 创建package实例。
例如:
PackageBuilder builder = new PackageBuilder();
builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "package1.drl" ) ) );
builder.addPackageFromXml( new
InputStreamReader( getClass().getResourceAsStream( "package2.xml" ) ) );
Package pkg = builder.getPackage();
运行时的类:
RuleBase 使用RuleBaseFactory 实例化,默认情况下返回一个ReteOO 的RuleBase。Package通过使用addPackage 方法按顺序加入。你可以指定任何名称空间的Packages 或者同一名称的多个包加入RuleBase。
RuleBase ruleBase = RuleBaseFactory.newRuleBase();
ruleBase.addPackage( pkg );
事实数据相关类:
WorkingMemory 保存运行时事实数据的地方。
由ruleBase产生:WorkingMemory wm= ruleBase.newStatefulSession();
加载事实数据:
wm.insert(object );
insert方法返回一个FactHandle对象指向workingMemory中对象的引用。如果要对Object进行修改删除等操作都要通过FactHander对象来完成。
在准备好Rule,和Fact后 就可以调用 WorkingMemory对象的 fireAllRules()方法执行规则引擎。
Agenda上面提到过它负有规划激活规则运行的责任。
它运行过程分两个阶段:
1) WorkingMemory Actions : assert 新的 facts ,修改存在的 facts 和 retract facts 都是 WorkingMemory Actions 。通过在应用程序中调用 fireAllRules() 方法,会使引擎 转换到 Agenda Evaluatioin 阶段。
2) Agenda Evaluation :尝试选择一条规则进行激发( fire )。如果规则没有找到就 退出,否则它就尝试激发这条规则,然后转换到 WorkingMemory Actions 阶段,直到 Agenda中为空。