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 阅读(23611) 评论(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

支持 支持  回复  更多评论