drools 学习笔记(二)

Drools 是一个开源的规则引擎,目前有Jboss管理,最新版本为4.X。
我们使用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 负有规划激活规则运行的责任。


以上是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
中为空。

Drools提供了一些监听器来获得规则引擎执行过程中发生的一些事件:
WorkingMemoryEventListene,AgendEventListener和RuleFlowEventListener

从名称来看我们也大概能知道他们分别的作用:
WorkingMemoryEventListene是监听WorkingMemory中发生的一些时间,WorkingMemory发生的事件那就是Fact的插入,删除,修改。
对应的借口为:
objectInserted(ObjectInsertedEvent e);
objectRetracted(ObjectRetractedEvent e);
objectUpdated(ObjectUpdatedEvent e);
AgendEventListener是舰艇运行过程中Agenda管理调配规则发生的一些事件:
Action 在我理解应该是一个冲突就是上面提到过的 完全符合规则条件的,包含规则和数据的对象。
activationCancelled action被取消,可能是因为在规则的执行过程中,某个对象被修改或者某个对象被删除引起。
activationCreated 当有数据能匹配到规则,就能发生这个事件。
afterActivationFired 在规则执行后触发这个事件
agendaGroupPopped 规则组。。。
agendaGroupPushed
beforeActivationFired 在规则执行前触发这个事件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值