`
daniel_tu
  • 浏览: 185390 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JBoss Rules 学习(四): Drools规则引擎 (下)

阅读更多

4 WorkingMemory:

Figure 4.1 WorkingMemory

WorkingMemory 是运行时规则引擎的主要类。它保持了所有被 asserted WorkingMemory 的数据的引用,直到取消( retracted )。 WorkingMemory 是有状态对象。它们的生命周期可长可短。如果从一个短生命周期的角度来同一个引擎进行交互,意味着你可以使用 RuleBase 对象来为每个 session 产生一个新的 WorkingMemory ,然后在结束 session discard 这个 WorkingMemory (产生一个 WorkingMemory 是一个廉价的操作)。另一种形式,就是在一个相当长的时间中(例如一个 conversation ),保持一个 WorkingMemory ,并且对于新的 facts 保持持续的更新。当你希望 dispose 一个 WorkingMemory 的时候,最好的实践就是调用 dispose() 方法,此时 RuleBase 中对它的引用将会被移除(尽管这是一个弱引用)。不管怎样最后它将会被当成垃圾收集掉。术语 WorkingMemory Actions 代表了对 WorkingMemory assertions retractions modifications

4.1 Facts

Facts 是从你的应用中,被 assert WorkingMemory 中的对象( beans )。 Facts 是规则可以访问的任意的 java 对象。规则引擎中的 facts 并不是“ clone facts ,它只是持有到你的应用中数据的引用。 Facts 是你的应用数据。 String 和其他没有 getter setter 的类不是有效的 Fact 。这样的类不能使用域约束( Field Constraints ),因为使用域约束要依靠 JavaBean 标准的 getter setter 来同对象交互。

4.2 Assertion

“Assertion” 是将 facts 告诉 WorkingMemory 的动作,例如 WorkingMemory.assertObject (yourObject) 。当你 assert 一个 fact ,它将被检查是否匹配规则。这意味着所有的匹配工作将会在 assert 的过程中完成。尽管如此,当你完成 assert facts 之后,你还要调用“ fireAllRules() ”方法来执行规则。

当一个对象被 assert 后,会返回一个 FactHandle 。这个 FactHandle 是一个代表在 Working Memory 中你的 asserted Object 的令牌( token )。当你希望 retract 或者 modify 一个对象的时候,这个令牌让你用来同 WorkingMemory 进行交互。

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> Cheese stilton  =   new  Cheese( " stilton " );
FactHandle stiltonHandle 
=  workingMemory.assertObject( stilton );

 

WorkingMeomry 有两种 assertion 模式: Equality Identity (默认是 Identity )。

Identity 模式下 WorkingMemory 使用一个 IdentityHashMap 来存储所有的 asserted Objects 。这个模式下,当 asserted Object 是同一个实例时,它返回同一个 FactHandle

Equality 模式下 WorkingMemory 使用一个 HashMap 来存储所有的 asserted Objects 。这个模式下,当 asserted Object 相等时,它返回同一个 FactHandle

WorkingMemory.assertObject(yourObjcet) 只是进行 assertion 的一种 regular 方法,还存在有一种称为 logical assertion 的动作)。

4.3 Retraction

基本上就是 assert 的逆操作。当你 retract 一个 fact WorkingMemory 将不再跟踪那个 fact 。任何被 activated 并依赖那个 fact 的规则将被取消。注意:完全有可能存在某条规则是依赖于一个 fact 的“不存在”( non existence )。在这种情况下, retract 一个 fact 将导致一条规则被激活。对一个 Fact 进行 Retraction ,必须用 assert 时返回的那个 FactHandle 做为参数。

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> Cheese stilton  =   new  Cheese( " stilton " );
FactHandle stiltonHandle 
=  workingMemory.assertObject( stilton );
.
workingMemory.retractObject( stiltonHandle );

4.4 Modification

当一个 Fact 被修改了,会通知规则引擎进行重新处理。在规则引擎内部实际上是对旧的 Fact 进行 retract ,然后对新的 Object 再进行 assert 。要使用 modifyObject() 方法来通知 Working Memory ,被改变的 Object 并不会自己通知规则引擎。注意: modifyObject() 方法总是要把被修改的 Object 做为第二参数,这就允许你把一个不可变对象替换为另一个新对象。

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> Cheese stilton  =   new  Cheese( " stilton " );
FactHandle stiltonHandle 
=  workingMemory.assertObject( stilton );
.
stilton.setPrice( 
100  );
workingMemory.modifyObject( stiltonHandle, stilton );

 

4.5 Globals

Global 是一个能够被传进 WorkingMemory 但不需要 assert 的命名对象。大多数这些对象被用来作为静态信息或服务。这些服务被用在一条规则的 RHS ,或者可能是从规则引擎返回对象的一种方法。

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> List list  =   new  ArrayList();
workingMemory.setGlobal(
" list " , list);

 

setGlobal() 方法传进去的命名对象必须同 RuleBase 中所定义的具有相同的类型(就是要同你的规则文件中用 Global 关键字所定义的类型相同),否则会抛出一个 RuntimeException 。如果一条规则在你 setGlobal 之前调用了定义的 Global ,会抛出一个 NullPointerException

4.6 Property Change Listener

如果你的 fact 对象是 JavaBean ,你可以为它们实现一个 property change listener ,然后把它告诉规则引擎。这意味着,当一个 fact 改变时,规则引擎将会自动知道,并进行响应的动作(你不需要调用 modifyObject() 方法来通知 WorkingMemory )。 Proxy libraries 将会帮助实现这一切。要让 Property Change Listener 生效,还要将 fact 设置为动态( dynamic )模式,通过将 true 做为 assertObject() 方法的第二个参数来实现:

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> Cheese stilton  =   new  Cheese( " stilton " );
FactHandle stiltonHandle 
=  workingMemory.assertObject( stilton,  true  );   // specifies t hat this is a dynamic fact

 

然后要在 JavaBean 中加入一个 PropertyChangeSupport 实例,和两个方法: addPropertyChangeListener() removePropertyChangeListener() 。最后要在 JavaBean setter 方法中通知 PropertyChangeSupport 所发生的变化。示例代码如下:

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> private   final  PropertyChangeSupport changes  =   new  PropertyChangeSupport(  this  );

public   void  addPropertyChangeListener( final  PropertyChangeListener l) {
    
this .changes.addPropertyChangeListener( l );
}

public   void  removePropertyChangeListener( final  PropertyChangeListener l) {
    
this .changes.removePropertyChangeListener( l );
}

public   void  setState( final  String newState) {
    String oldState 
=   this .state;
    
this .state  =  newState;
this .changes.firePropertyChange(  " state " , oldState, newState );


5. Agenda:


Figure 5.1 . Agenda

Agenda RETE 的一个特点。在一个 WorkingMemory Action 发生时,可能会有多条规则发生完全匹配。当一条规则完全匹配的时候,一个 Activation 就被创建(引用了这条规则和与其匹配的 facts ),然后放进 Agenda 中。 Agenda 通过使用冲突解决策略( Conflict Resolution Strategy )来安排这些 Activations 的执行。

引擎工作在一个“ 2 阶段”模式下:

<!-- [if !supportLists]--> 1)  <!-- [endif]--> WorkingMemory Actions assert 新的 facts ,修改存在的 facts retract facts 都是 WorkingMemory Actions 。通过在应用程序中调用 fireAllRules() 方法,会使引擎转换到 Agenda Evaluatioin 阶段。

<!-- [if !supportLists]--> 2)  <!-- [endif]--> Agenda Evaluation :尝试选择一条规则进行激发( fire )。如果规则没有找到就退出,否则它就尝试激发这条规则,然后转换到 WorkingMemory Actions 阶段,直到 Agenda 中为空。

这个过程一直重复,直到 Agenda 是空的,此时控制权就回到应用程序中。。当 WorkingMemory Actions 发生时,没有规则正在被激发。

下图说明了这个循环的过程:


Figure  5.2 . Two Phase Execution

5 1 Conflict Resultion

当有多条 rules agenda 中,就需要解决冲突。当激发一条规则时,会对 WorkingMemory 产生副作用。规则引擎需要知道规则要以什么顺序来激发(例如,激发 rule A 可能会引起 rule B 被从 agenda 中移除。)

Drools 采取的冲突解决策略有 2 种,按照优先级排列如下: Salience LIFO (后进先出)。最易懂的策略是“ Salience ”,即优先级, user 可以为某个 rule 指定一个高一点的优先级(通过附给它一个比较大的数字)。高 Salience rule 将会被优先激发。

5 2 Agenda Groups

Agenda Groups 是划分 Agenda rules (其实是“ activations ”)的一种方法。在任意一个时刻,只有一个 group 拥有“ focus ”,这意味着只有在那个 group 中的 activations 才是有效的。

Agenda Groups 是在 grouped rules 之间创建一个“流”( flow )的简便的方法。你可以在规则引擎中,或是用 API 来切换具有焦点的组。如果你的规则有很明确的多“阶段”( phases )或多“序列”( sequences )的处理,可以考虑用 Agenda Groups 来达到这个目的。

每次调用 setFocus() 方法的时候,那个 Agenda Group 就会被压入一个堆栈,当这个有焦点的组为空时,它就会被弹出,然后下一个组就会被执行。一个 Agenda Group 可以出现在堆栈的多个位置。默认的 Agenda Group 是“ MAIN ”,所有没有被指定 Agenda Group Activations 都被放到那个组中,这个组总是被放在堆栈的第一个组,并默认给予焦点。

5 3  Agenda Filters


Figure 5.3. Agenda Filter

Filter 必须实现 AgendaFilter 接口,用来允许或禁止一个 activation 能够被激发。 Drools 提供了下面几种方便的默认实现:

<!-- [if !supportLists]--> ·         <!-- [endif]--> RuleNameEndWithAgendaFilter

<!-- [if !supportLists]--> ·         <!-- [endif]--> RuleNameEqualsAgendaFilter

<!-- [if !supportLists]--> ·         <!-- [endif]--> RuleNameStartsWithAgendaFilter

要使用一个 filter 就要在调用 fireAllRules() 方法的时候指定它。下面的例子将对所有名字以“ Test ”结尾的规则进行过滤:

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> workingMemory.fireAllRules(  new  RuleNameEndsWithAgendaFilter(  " Test "  ) );

 

6.事件模型( Event Model

Event 包里提供了规则引擎的事件机制,包括规则激发,对象被 asserted 等等。你可以使用事件机制来进行 AOP 编程。

有两种类型的 Event Listener WorkingMemoryEventListener AgendaEventListener


Figure 6.1. WorkingMemoryEventListener


Figure 6.2  AgendaEventListener

 

对两个 EventListener 接口都提供了默认实现,但在方法中并没有做任何事。你可以继承这两个默认实现来完成你自己的实现- DefaultAgendaEventListener DefaultWorkingMemoryEventListener 。下面代码说明了如何扩展一个 DefaultAgendaEventListner 并把它加到 WorkingMemory 中,例子中只完成了 afterActivationFired() 方法:

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> workingMemory.addEventListener(  new  DefaultAgendaEventListener() {                            
   
public   void  afterActivationFired(AfterActivationFiredEvent event) {
       
super .afterActivationFired( event );
       System.out.println( event );
   }
   
});

Drools 也提供了 DebugWorkingMemoryEventListener DebugAgendaEventListener 两个实现类,在这两个类的方法中实现了 debug 信息的输出:

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> workingMemory.addEventListener(  new  DebugWorkingMemoryEventListener() );

 

分享到:
评论

相关推荐

    JAVA规则引擎JBOSS RULES(DROOLS 6.5) 动态规则

    JAVA规则引擎JBOSS RULES,也被称为DROOLS,是一种强大的业务规则管理系统,它允许开发者用自然语言来编写业务规则,并在运行时执行这些规则。DROOLS 6.5是该规则引擎的一个版本,提供了许多改进和新特性,以提高...

    jboss rules 用户指南(中文)

    之前学习jboss rules 只能自己一点点的啃英文用户指南,后来终于找到了中文版的翻译版本,真是高兴,立即奉献给大家,让对规则引擎感兴趣的朋友也能一堵为快。 内容摘要:JBoss Rules 的前身是Codehaus的一个开源...

    myeclipse安装drools jboss rules规则引擎

    myeclipse安装drools jboss rules规则引擎

    Drools JBoss Rules 5 Developers Guide

    ### Drools JBoss Rules 5 开发者指南 #### 知识点一:Drools 平台介绍 - **定义与背景**:Drools 是一个开源业务规则管理系统(Business Rule Management System, BRMS),它支持开发人员通过声明式编程来实现...

    Drools开发教程、规则引擎.pdf

    在某些情况下,Drools可能作为JBoss Rules或Red Hat JBoss BRMS的一部分进行安装。此外,集成开发环境(IDE)也需要配置好,以便开发者能够编写、编译和运行Drools规则文件。常见的IDE选择有Eclipse、IntelliJ IDEA...

    从Drools规则引擎到风控反洗钱系统v0.3.2.pdf

    2. **Drools规则引擎**:Drools(JBossRules)是一个易于访问企业策略、易于调整和管理的开源业务规则引擎。它符合业界标准,并以速度快、效率高著称。业务分析师或审核人员可以轻松查看和验证编码规则是否执行了所...

    JBoss Rules入门资料集锦

    JBoss Rules(Drools)提供了这种规则引擎,它基于马尔科夫决策过程(Markov Decision Processes)理论,能够处理大量的规则并根据情况自动执行决策。 在资料中,你可能会看到关于以下核心概念的讲解: 1. **规则...

    规则引擎drools-jboss rules

    规则引擎 Drools-JBoss Rules 规则引擎是人工智能(Artificial Intelligence)领域中的一种技术,用于实现专家系统,专家系统使用知识表示把知识编码简化成一个可用于推理的知识库。规则引擎是一个基于规则的方法...

    规则引擎Drools在J2EE项目开发中的应用

    5. **融合JBOSS BRMS**:Drools是JBoss Business Automation的一部分,与BRMS(Business Rules Management System)和BPM(Business Process Management)平台相结合,可以构建完整的业务自动化解决方案。...

    JBoss_Rules学习

    - **技术核心**:JBoss Rules(原 Drools)是基于 Charles Forgy 的 RETE 算法的一种规则引擎实现,专门为 Java 语言设计。通过将 RETE 算法与面向对象的接口相结合,使得商业规则能够以更加自然和直观的方式表达...

    从Drools规则引擎到风控反洗钱系统V0.2.3

    其中,Drools是最流行的开源规则引擎之一,而VisualRules和ILog则是知名的商业解决方案。 **1.2 Drools规则引擎** Drools是一款开源的业务规则管理系统(BRMS),它使用了Charles Forgy的RETE算法,这是一种高效的...

    Drools5规则引擎学习研究

    Drools,原名JBoss Rules,是一个强大的开源业务规则管理系统,由JBoss公司开发,基于Charles Forgy的RTE算法,专为Java设计。它允许业务分析师和审核人员以直观的方式查看和验证业务规则,以确保编码的规则准确地...

    Drools JBoss Rules 5.X Developer's Guide

    Drools JBoss Rules是JBoss企业中间件产品套件的一部分,它是一个基于Java平台的业务规则引擎(Business Rules Engine),它允许业务逻辑从业务应用程序中分离出来,并以一种易于管理和维护的方式呈现。Drools JBoss...

    Drools JBoss Rules 5.0 Developer's Guide

    《Drools JBoss Rules 5.0 Developer's Guide》是一本专为希望利用Drools平台开发基于规则的业务逻辑的开发者而编写的指南。本书由Michal Bali撰写,于2009年7月首次出版,并由Packt Publishing发行。该书涵盖了...

    JBoss Rules 初学实例

    【JBoss Rules 初学实例】是针对Drools规则引擎的一个入门教程,适用于初次接触该框架的开发者。Drools是一款开源的业务规则管理系统,它允许开发人员以声明式的方式编写业务规则,使得复杂的逻辑处理变得更加简洁...

    Drools5规则引擎开发文档

    ### Drools5规则引擎开发文档知识点详解 #### 一、Drools5规则引擎简介 Drools是一款基于Java的开源规则引擎,广泛应用于业务逻辑处理领域,它可以帮助开发者快速地构建灵活且复杂的业务规则系统。Drools支持多种...

    Drools规则引擎应用分析

    ### Drools规则引擎应用分析 #### 一、引言 Drools规则引擎作为一款基于JSR94标准和Rete算法的开源框架,在软件设计过程...通过这些基础知识的学习,开发者可以更好地利用Drools规则引擎来优化软件系统的设计与实现。

    jboss rules 用户指南

    ### jBoss Rules 用户指南知识点详解 #### 一、规则引擎概念及背景 ##### 1.1 什么是规则引擎 规则引擎是一种软件系统,它能够基于一组预定义的规则来处理数据,进而推导出结论或者执行特定的操作。规则引擎的...

Global site tag (gtag.js) - Google Analytics