guangnian0412's BLOG

Java in my life

常用链接

统计

积分与排名

我关注的Blog

最新评论

JBoss Rules 学习(一): 什么是Rule

        学习JBoss Rules有几天了,因为这方面的中文资料较少,所以这几天都在看官网上的manual。这是一份不错的教程,我把我看的一些重要的东西翻译整理了一下,希望可以对想学习JBoss Rules的同学们提供一点帮助。
       在开始这份教程之前,我先简要介绍一下JBoss Rules:
       JBoss Rules 的前身是Codehaus的一个开源项目叫Drools。最近被纳入JBoss门下,更名为JBoss Rules,成为了JBoss应用服务器的规则引擎。
       Drools是为Java量身定制的基于Charles  Forgy的RETE算法的规则引擎的实现。具有了OO接口的RETE,使得商业规则有了更自然的表达。
 
       既然JBoss Rules是一个商业规则引擎,那我们就要先知道到底什么是Rules,即规则。在JBoss Rules中,规则是如何被表示的

Rules

一条规则是对商业知识的编码。一条规则有 attributes ,一个 Left Hand Side LHS )和一个 Right Hand Side RHS )。 Drools 允许下列几种 attributes salience agenda-group no-loop auto-focus duration activation-group

rule “ < name > ”    
    
< attribute >   < value >     
    when        
        
< LHS >     
    then        
        
< RHS >
end

规则的
LHS 由一个或多个条件( Conditions )组成。当所有的条件( Conditions )都满足并为真时, RHS 将被执行。 RHS 被称为结果( Consequence )。 LHS RHS 类似于:
if  (  < LHS >  ) {
    
< RHS >
}

规则可以通过 package 关键字同一个命名空间( namespace )相关联;其他的规则引擎可能称此为规则集( Rule Set )。一个 package 声明了 imports global 变量, functions rules


package  com.sample

import  java.util.List
import  com.sample.Cheese

global List cheeses

function 
void  exampleFunction(Cheese cheese) {
    System.out.println( cheese );
}

rule “A Cheesy Rule”
    when
        cheese : Cheese( type 
==   " stilton "  )
    then
        exampleFunction( cheese );
        cheeses.add( cheese );
end

对新的数据和被修改的数据进行规则的匹配称为模式匹配( Pattern Matching )。进行匹配的引擎称为推理机( Inference Engine )。被访问的规则称为 ProductionMemory ,被推理机进行匹配的数据称为 WorkingMemory Agenda 管理被匹配规则的执行。推理机所采用的模式匹配算法有下列几种: Linear RETE Treat Leaps

Drools 采用了 RETE Leaps 的实现。 Drools RETE 实现被称为 ReteOO ,表示 Drools Rete 算法进行了加强和优化的实现。



一条规则的 LHS Conditional Element 和域约束( Field Constraints )。下面的例子显示了对一个 Cheese Fact 使用了字面域约束( Literal Field Constraint

rule  " Cheddar Cheese "
    when
        Cheese( type 
==   " cheddar "  )
    then
        System.out.println( 
" cheddar "  );
end

上面的这个例子类似于:

public   void  cheddarCheese(Cheese cheese) {
    
if  ( cheese.getType().equals( " cheddar " ) {
        System.out.println( 
" cheddar "  );
    }
}

规则引擎实现了数据同逻辑的完全解耦。规则并不能被直接调用,因为它们不是方法或函数,规则的激发是对 WorkingMemory 中数据变化的响应。结果( Consequence ,即 RHS )作为 LHS events 完全匹配的 Listener

rules 被加入 Productioin Memory 后, rules 被规则引擎用 RETE 算法分解成一个图:



Facts assert 进入 WorkingMemory 中后,规则引擎找到匹配的 ObjectTypeNode ,然后将此 Fact 传播到下一个节点。 ObjectTypeNode 拥有一块内存来保存所有匹配的 facts 。在我们的例子中,下一个节点是一个域约束( Field Constraint ), type = = “cheddar” 。如果某个 Cheese 对象的类型不是“ cheddar ”,这个 fact 将不会被传播到网络的下一个节点。如果是“ cheddar ”类型,它将被记录到 AlphaNode 的内存中,并传播到网络的下一个节点。 AlphaNode 是古典 RETE 术语,它是一个单输入 / 单输出的节点。最后通过 AlphaNode fact 被传播到 Terminal Node Terminal Node 是最终节点,到此我们说这条规则被完全匹配,并准备激发。

当一条规则被完全匹配,它并没有立刻被激发(在 RETE 中是这样,但在 Leaps 中它会立刻被激发)。这条规则和与其匹配的 facts 将激活被放入 Agenda ,由 Agenda 来负责安排激发 Activations (指的是 rule + the matched facts )。

下面的图很清楚的说明了 Drools 规则引擎的执行过程:


数据被 assert WorkingMemory 后,和 RuleBase 中的 rule 进行匹配(确切的说应该是 rule LHS ),如果匹配成功这条 rule 连同和它匹配的数据(此时就叫做 Activation )一起被放入 Agenda ,等待 Agenda 来负责安排激发 Activation (其实就是执行 rule RHS ),上图中的菱形部分就是在 Agenda 中来执行的, Agenda 就会根据冲突解决策略来安排 Activation 的执行顺序。

posted on 2006-06-01 16:52 guangnian 阅读(22577) 评论(23)  编辑  收藏 所属分类: JBoss Rules(Drools)

评论

# re: JBoss Rules 学习(一): 什么是Rule 2006-06-01 18:06 江南白衣

好啊,又有人开始学习和中文化总结Drools了,密切关注中。  回复  更多评论   

# re: JBoss Rules 学习(一): 什么是Rule 2006-06-02 10:19 C[ETI]O@quaffsoft

cheeses不需要new出来?  回复  更多评论   

# re: JBoss Rules 学习(一): 什么是Rule 2006-06-02 10:49 guangnian

@C[ETI]O@quaffsoft
你指的是global List cheeses 吗?对于Drools rules中global属性的用法我还不太清楚,但是有一点就是,上面的Drools rules例子是写在.drl文件中的,而不是写在.java中,所有不要太用java的观点来看那段例子。上面的package也是跟java不太一样的概念,用package关键字并不会创建相应的目录层次。  回复  更多评论   

# re: JBoss Rules 学习(一): 什么是Rule 2006-06-02 11:22 Water Ye

关于Globals的用法

java.util.Vector globalVector = new java.util.Vector( );
java.util.Map map = new java.util.HashMap( );
map.put( "vector", globalVector );
//Open a stateless Session StatelessRuleSession srs = (StatelessRuleSession) runtime.createRuleSession( "SistersRules", map, RuleRuntime.STATELESS_SESSION_TYPE );
...
// Persons added to List
// call executeRules( ) giving a List of Objects as parameter
// There are rules which will put Objects in the Vector
// fetch the vector from the map
v = (java.util.Vector)map.get("vector");  回复  更多评论   

# re: JBoss Rules 学习(一): 什么是Rule 2006-06-08 10:49 chb

写的相当好,不知和ILOG JRULES有什么区别!  回复  更多评论   

# re: JBoss Rules 学习(一): 什么是Rule 2006-06-08 14:52 guangnian

@chb
ILOG JRULES是商用的吧。
JBoss Rules是开源免费的哦  回复  更多评论   

# re: JBoss Rules 学习(一): 什么是Rule 2006-10-20 10:01 A3

牛,  回复  更多评论   

# re: JBoss Rules 学习(一): 什么是Rule 2006-12-05 15:24 beike QQ:63955261

准备研究 关注一下  回复  更多评论   

# re: JBoss Rules 学习(一): 什么是Rule 2007-07-04 11:34 liujg

好啊!终于找到中文的资料!严重感谢你!  回复  更多评论   

# re: JBoss Rules 学习(一): 什么是Rule 2007-07-24 16:05 乔君

太感谢你了,这方面的资料非常少啊,虽然我也能翻译,但是基础概念不清楚,翻译起来非常的吃力,不管怎么说,谢谢!  回复  更多评论   

# re: JBoss Rules 学习(一): 什么是Rule 2007-07-27 17:15 darkhe

感谢,学习中  回复  更多评论   

# re: JBoss Rules 学习(一): 什么是Rule 2007-07-30 09:04 小白之家

学习,谢谢!   回复  更多评论   

# re: JBoss Rules 学习(一): 什么是Rule[未登录] 2008-01-23 09:20 yang

谢谢你   回复  更多评论   

# re: JBoss Rules 学习(一): 什么是Rule[未登录] 2008-05-28 15:06 fish

简单地说,DROOLS的内部运行机制是数据驱动的  回复  更多评论   

# re: JBoss Rules 学习(一): 什么是Rule 2008-11-16 12:47 混凝土

太感谢了,正在一筹莫展的时候, g到了楼主的笔记.严重受用  回复  更多评论   

# re: JBoss Rules 学习(一): 什么是Rule[未登录] 2009-01-07 10:24 龙龙

感谢!  回复  更多评论   

# re: JBoss Rules 学习(一): 什么是Rule 2009-05-26 10:43 jsjxy

很好,连载,很强大!佩服!  回复  更多评论   

# re: JBoss Rules 学习(一): 什么是Rule 2009-07-04 15:03 快乐一休

写的真的很棒
看完帮助文档一头雾水
现在清楚了些  回复  更多评论   

# re: JBoss Rules 学习(一): 什么是Rule 2010-11-18 09:58 luxy26

太感谢了,分析的很清晰!比manual强多了  回复  更多评论   

# re: JBoss Rules 学习(一): 什么是Rule 2011-05-09 13:39 yangyangcwu

谢谢啊,太好了  回复  更多评论   

# re: JBoss Rules 学习(一): 什么是Rule 2013-01-30 13:17 驾辕马夫

太好了,我刚开始学习JBoss Rules正没有思路呢,谢谢啊。  回复  更多评论   

# re: JBoss Rules 学习(一): 什么是Rule 2013-04-24 18:01 dx

支持 支持  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: