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

来源:互联网 发布:ubuntu 16 tty菱形乱码 编辑:程序博客网 时间:2024/05/08 12:07

学习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 durationactivation-group


规则引擎实现了数据同逻辑的完全解耦。规则并不能被直接调用,因为它们不是方法或函数,规则的激发是对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的执行顺序。

0 0