﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-clant-文章分类-规则引擎</title><link>http://www.blogjava.net/clant/category/17974.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 21:54:11 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 21:54:11 GMT</pubDate><ttl>60</ttl><item><title>Java规则引擎工作原理及其应用</title><link>http://www.blogjava.net/clant/articles/87951.html</link><dc:creator>BPM </dc:creator><author>BPM </author><pubDate>Fri, 15 Dec 2006 07:19:00 GMT</pubDate><guid>http://www.blogjava.net/clant/articles/87951.html</guid><wfw:comment>http://www.blogjava.net/clant/comments/87951.html</wfw:comment><comments>http://www.blogjava.net/clant/articles/87951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clant/comments/commentRss/87951.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clant/services/trackbacks/87951.html</trackback:ping><description><![CDATA[
		<strong>摘 要</strong> Java规则引擎是一种嵌入在Java程序中的组件，它的任务是把当前提交给引擎的Java数据对象与加载在引擎中的业务规则进行测试和比对，激活那些符合当前数据状态下的业务规则，根据业务规则中声明的执行逻辑，触发应用程序中对应的操作。 <b>引言</b>目前，Java社区推动并发展了一种引人注目的新技术——Java规则引擎（Rule Engine）。利用它就可以在应用系统中分离商业决策者的商业决策逻辑和应用开发者的技术决策，并把这些商业决策放在中心数据库或其他统一的地方，让它们能在运行时可以动态地管理和修改，从而为企业保持灵活性和竞争力提供有效的技术支持。<br /><b><br />规则引擎的原理<br /></b><strong>1、基于规则的专家系统（RBES）简介</strong>Java规则引擎起源于基于规则的专家系统，而基于规则的专家系统又是专家系统的其中一个分支。专家系统属于人工智能的范畴，它模仿人类的推理方式，使用试探性的方法进行推理，并使用人类能理解的术语解释和证明它的推理结论。为了更深入地了解Java规则引擎，下面简要地介绍基于规则的专家系统。RBES包括三部分：Rule Base（knowledge base）、Working Memory（fact base）和Inference Engine。它们的结构如下系统所示： 
<center><img src="http://www.85flash.com/Files/BeyondPic/2006-10/22/06102213335938787.gif" border="0" /></center><p></p><p style="TEXT-INDENT: 2em" align="center">图1 基于规则的专家系统构成如图1所示，推理引擎包括三部分：模式匹配器（Pattern Matcher）、议程（Agenda）和执行引擎（Execution Engine）。推理引擎通过决定哪些规则满足事实或目标，并授予规则优先级，满足事实或目标的规则被加入议程。模式匹配器决定选择执行哪个规则，何时执行规则；议程管理模式匹配器挑选出来的规则的执行次序；执行引擎负责执行规则和其他动作。和人类的思维相对应，推理引擎存在两者推理方式：演绎法（Forward-Chaining）和归纳法（Backward-Chaining）。演绎法从一个初始的事实出发，不断地应用规则得出结论（或执行指定的动作）。而归纳法则是根据假设，不断地寻找符合假设的事实。Rete算法是目前效率最高的一个Forward-Chaining推理算法，许多Java规则引擎都是基于Rete算法来进行推理计算的。推理引擎的推理步骤如下：(1)将初始数据（fact）输入Working Memory。(2)使用Pattern Matcher比较规则库（rule base）中的规则（rule）和数据（fact）。(3)如果执行规则存在冲突（conflict），即同时激活了多个规则，将冲突的规则放入冲突集合。(4)解决冲突，将激活的规则按顺序放入Agenda。(5)使用执行引擎执行Agenda中的规则。重复步骤2至5，直到执行完毕所有Agenda中的规则。上述即是规则引擎的原始架构，Java规则引擎就是从这一原始架构演变而来的。<strong>2、规则引擎相关构件</strong>规则引擎是一种根据规则中包含的指定过滤条件，判断其能否匹配运行时刻的实时条件来执行规则中所规定的动作的引擎。与规则引擎相关的有四个基本概念，为更好地理解规则引擎的工作原理，下面将对这些概念进行逐一介绍。1)信息元（Information Unit）信息元是规则引擎的基本建筑块，它是一个包含了特定事件的所有信息的对象。这些信息包括：消息、产生事件的应用程序标识、事件产生事件、信息元类型、相关规则集、通用方法、通用属性以及一些系统相关信息等等。 2)信息服务（Information Services）信息服务产生信息元对象。每个信息服务产生它自己类型相对应的信息元对象。即特定信息服务根据信息元所产生每个信息元对象有相同的格式，但可以有不同的属性和规则集。需要注意的是，在一台机器上可以运行许多不同的信息服务，还可以运行同一信息服务的不同实例。但无论如何，每个信息服务只产生它自己类型相对应的信息元。3)规则集（Rule Set）顾名思义，规则集就是许多规则的集合。每条规则包含一个条件过滤器和多个动作。一个条件过滤器可以包含多个过滤条件。条件过滤器是多个布尔表达式的组合，其组合结果仍然是一个布尔类型的。在程序运行时，动作将会在条件过滤器值为真的情况下执行。除了一般的执行动作，还有三类比较特别的动作，它们分别是：放弃动作（Discard Action）、包含动作（Include Action）和使信息元对象内容持久化的动作。前两种动作类型的区别将在2.3规则引擎工作机制小节介绍。4)队列管理器（Queue Manager）队列管理器用来管理来自不同信息服务的信息元对象的队列。下面将研究规则引擎的这些相关构件是如何协同工作的。如图2所示，处理过程分为四个阶段进行：信息服务接受事件并将其转化为信息元，然后这些信息元被传给队列管理器，最后规则引擎接收这些信息元并应用它们自身携带的规则加以执行，直到队列管理器中不再有信息元。 </p><center><img src="http://www.85flash.com/Files/BeyondPic/2006-10/22/06102213335984478.gif" border="0" /></center><p></p><p style="TEXT-INDENT: 2em" align="center">图2 处理过程协作图<strong>3、规则引擎的工作机制</strong>下面专门研究规则引擎的内部处理过程。如图3所示，规则引擎从队列管理器中依次接收信息元，然后依规则的定义顺序检查信息元所带规则集中的规则。如图所示，规则引擎检查第一个规则并对其条件过滤器求值，如果值为假，所有与此规则相关的动作皆被忽略并继续执行下一条规则。如果第二条规则的过滤器值为真，所有与此规则相关的动作皆依定义顺序执行，执行完毕继续下一条规则。该信息元中的所有规则执行完毕后，信息元将被销毁，然后从队列管理器接收下一个信息元。在这个过程中并未考虑两个特殊动作：放弃动作（Discard Action）和包含动作（Include Action）。放弃动作如果被执行，将会跳过其所在信息元中接下来的所有规则，并销毁所在信息元，规则引擎继续接收队列管理器中的下一个信息元。包含动作其实就是动作中包含其它现存规则集的动作。包含动作如果被执行，规则引擎将暂停并进入被包含的规则集，执行完毕后，规则引擎还会返回原来暂停的地方继续执行。这一过程将递归进行。 </p><center><img src="http://www.85flash.com/Files/BeyondPic/2006-10/22/06102213340025059.gif" border="0" /></center><p></p><p style="TEXT-INDENT: 2em" align="center">图3 规则引擎工作机制Java规则引擎的工作机制与上述规则引擎机制十分类似，只不过对上述概念进行了重新包装组合。Java规则引擎对提交给引擎的Java数据对象进行检索，根据这些对象的当前属性值和它们之间的关系，从加载到引擎的规则集中发现符合条件的规则，创建这些规则的执行实例。这些实例将在引擎接到执行指令时、依照某种优先序依次执行。一般来讲，Java规则引擎内部由下面几个部分构成：工作内存（Working Memory）即工作区，用于存放被引擎引用的数据对象集合；规则执行队列，用于存放被激活的规则执行实例;静态规则区，用于存放所有被加载的业务规则，这些规则将按照某种数据结构组织，当工作区中的数据发生改变后，引擎需要迅速根据工作区中的对象现状，调整规则执行队列中的规则执行实例。Java规则引擎的结构示意图如图4所示。 </p><center><img src="http://www.85flash.com/Files/BeyondPic/2006-10/22/06102213340010350.gif" border="0" /></center><p></p><p style="TEXT-INDENT: 2em" align="center">图4 Java规则引擎工作机制当引擎执行时，会根据规则执行队列中的优先顺序逐条执行规则执行实例，由于规则的执行部分可能会改变工作区的数据对象，从而会使队列中的某些规则执行实例因为条件改变而失效，必须从队列中撤销，也可能会激活原来不满足条件的规则，生成新的规则执行实例进入队列。于是就产生了一种“动态”的规则执行链，形成规则的推理机制。这种规则的“链式”反应完全是由工作区中的数据驱动的。 任何一个规则引擎都需要很好地解决规则的推理机制和规则条件匹配的效率问题。规则条件匹配的效率决定了引擎的性能，引擎需要迅速测试工作区中的数据对象，从加载的规则集中发现符合条件的规则，生成规则执行实例。1982年美国卡耐基·梅隆大学的Charles L. Forgy发明了一种叫Rete算法，很好地解决了这方面的问题。目前世界顶尖的商用业务规则引擎产品基本上都使用Rete算法。</p><img src ="http://www.blogjava.net/clant/aggbug/87951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clant/" target="_blank">BPM </a> 2006-12-15 15:19 <a href="http://www.blogjava.net/clant/articles/87951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（六）: Drools规则语言详解（上） </title><link>http://www.blogjava.net/clant/articles/85146.html</link><dc:creator>BPM </dc:creator><author>BPM </author><pubDate>Sun, 03 Dec 2006 01:56:00 GMT</pubDate><guid>http://www.blogjava.net/clant/articles/85146.html</guid><wfw:comment>http://www.blogjava.net/clant/comments/85146.html</wfw:comment><comments>http://www.blogjava.net/clant/articles/85146.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clant/comments/commentRss/85146.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clant/services/trackbacks/85146.html</trackback:ping><description><![CDATA[
		<div align="center">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">Drools</span>
						<span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体">规则语言详解（上）<br /></span>
				</b>
				<div align="left">
						<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">&lt;!--[if !supportLists]--&gt; <b><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black">1．<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">  </span></span></b>&lt;!--[endif]--&gt; <b><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体">概述：</span></b><b><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black"><?XML:NAMESPACE PREFIX = O /?><o:p></o:p></span></b></p>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">Drools 3 </span>
						<span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">采用了原生的规则语言，那是一种非</span>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">XML</span>
						<span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">文本格式。在符号方面，这种格式是非常轻量的，并且通过“</span>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">expanders</span>
						<span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">”支持符合你问题域的</span>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">Domain Specific Language</span>
						<span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">（</span>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">DSL</span>
						<span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">）。这一章把焦点放在了</span>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">Drools</span>
						<span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">原生的规则格式。如果你想从技术上了解规则语言的机制，可以参考“</span>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">drl.g</span>
						<span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">”源文件，这是用</span>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">Antlr3</span>
						<span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">语法来描述规则语言。如果你使用</span>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">Rule Workbench</span>
						<span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">，内容助手将会为你完成大量的规则结构，例如输入“</span>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">ru</span>
						<span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">”，然后按</span>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">ctrl</span>
						<span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">＋</span>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">space</span>
						<span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">，会为你建立规则结构。<br /></span>
						<p class="MsoNormal" style="MARGIN-LEFT: 18.75pt; TEXT-INDENT: -18.75pt">&lt;!--[if !supportLists]--&gt; <font size="3"><b><span lang="EN-US" style="COLOR: black">1.1<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">    </span></span></b></font>&lt;!--[endif]--&gt; <b><font size="3"><span style="COLOR: black; FONT-FAMILY: 宋体">规则文件</span></font><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></b></p>
						<p class="MsoNormal">
								<span style="COLOR: black; FONT-FAMILY: 宋体">一个规则文件通常是一个以</span>
								<span lang="EN-US" style="COLOR: black">.drl</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">扩展名结尾的文件。在一个</span>
								<span lang="EN-US" style="COLOR: black">drl</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">文件中，你可以有多条</span>
								<span lang="EN-US" style="COLOR: black">rules</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">，</span>
								<span lang="EN-US" style="COLOR: black">functions</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">等等。尽管如此，你也可以将你的规则分布在多个文件中，这有利于管理大量的规则。一个</span>
								<span lang="EN-US" style="COLOR: black">DRL</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">文件是一个简单的文本文件。</span>
								<span lang="EN-US" style="COLOR: black">
										<o:p>
										</o:p>
								</span>
						</p>
						<p class="MsoNormal">
								<b>
										<span lang="EN-US" style="COLOR: black">1.2 </span>
								</b>
								<b>
										<span style="COLOR: black; FONT-FAMILY: 宋体">规则的结构</span>
										<span lang="EN-US" style="COLOR: black">
												<o:p>
												</o:p>
										</span>
								</b>
						</p>
						<p class="MsoNormal">
								<span style="COLOR: black; FONT-FAMILY: 宋体">一个规则结构大致如下：</span>
						</p>
						<p class="MsoNormal">
								<span style="COLOR: black; FONT-FAMILY: 宋体">
								</span>
						</p>
						<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
								<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
								<span style="COLOR: rgb(0,0,0)">rule </span>
								<span style="COLOR: rgb(0,0,0)">"</span>
								<span style="COLOR: rgb(0,0,0)">name</span>
								<span style="COLOR: rgb(0,0,0)">"</span>
								<span style="COLOR: rgb(0,0,0)">
										<br />    ATTRIBUTES<br />    when<br />        LHS<br />    then<br />        RHS<br />end<br /></span>
						</div>
						<p>
						</p>
						<p class="MsoNormal">
								<span style="COLOR: black; FONT-FAMILY: 宋体">可以看到，这是非常简单的。通常的标点符号都是不需要的，甚至连“</span>
								<span lang="EN-US" style="COLOR: black">name</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">”的双引号都是不需要的。</span>
								<span lang="EN-US">ATTRIBUTES</span>
								<span style="FONT-FAMILY: 宋体">是简单的，也是可选的，来提示规则的行为方式。</span>
								<span lang="EN-US">LHS</span>
								<span style="FONT-FAMILY: 宋体">是规则的条件部分，需要按照一定的语法来写。</span>
								<span lang="EN-US">RHS</span>
								<span style="FONT-FAMILY: 宋体">基本上是一个允许执行</span>
								<span lang="EN-US">Java</span>
								<span style="FONT-FAMILY: 宋体">语法的代码的块（以后将会支持</span>
								<span lang="EN-US">groovy</span>
								<span style="FONT-FAMILY: 宋体">和</span>
								<span lang="EN-US">C</span>
								<span style="FONT-FAMILY: 宋体">＃）。任何在</span>
								<span lang="EN-US">LHS</span>
								<span style="FONT-FAMILY: 宋体">中使用的变量都可以在</span>
								<span lang="EN-US">RHS</span>
								<span style="FONT-FAMILY: 宋体">中使用。</span>
						</p>
						<p class="MsoNormal">
								<span style="FONT-FAMILY: 宋体">注意：每行开始的空格是不重要的，除非在</span>
								<span lang="EN-US">DSL</span>
								<span style="FONT-FAMILY: 宋体">（</span>
								<span lang="EN-US">Domain Specific Language</span>
								<span style="FONT-FAMILY: 宋体">）语言中有特别的指明。</span>
						</p>
						<p class="MsoNormal">
						</p>
						<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">&lt;!--[if !supportLists]--&gt; <b><span lang="EN-US">1.3<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">   </span></span></b>&lt;!--[endif]--&gt; <b><span lang="EN-US">Domain Specific Language<o:p></o:p></span></b></p>
						<p class="MsoNormal">
								<span lang="EN-US">Domain Specific Language</span>
								<span style="FONT-FAMILY: 宋体">是对原生规则语言的加强。它们使用“</span>
								<span lang="EN-US">expander</span>
								<span style="FONT-FAMILY: 宋体">”机制。</span>
								<span lang="EN-US">Expander</span>
								<span style="FONT-FAMILY: 宋体">机制是一种可扩展的</span>
								<span lang="EN-US">API</span>
								<span style="FONT-FAMILY: 宋体">。你可以使用</span>
								<span lang="EN-US">.dsl</span>
								<span style="FONT-FAMILY: 宋体">文件，来提供从域或自然语言到规则语言和你的域对象的映射。你可以将</span>
								<span lang="EN-US">.dsl</span>
								<span style="FONT-FAMILY: 宋体">文件看成是对你的域模型的映射。</span>
								<span lang="EN-US">DSL</span>
								<span style="FONT-FAMILY: 宋体">提供了更高的规则可读性，你可以选择使用你自己创建的</span>
								<span lang="EN-US">DSL</span>
								<span style="FONT-FAMILY: 宋体">，或者是原生的规则语言。</span>
						</p>
						<p class="MsoNormal">
						</p>
						<p class="MsoNormal">
								<b>
										<span lang="EN-US">1.4 </span>
								</b>
								<b>
										<span style="FONT-FAMILY: 宋体">保留字</span>
										<span lang="EN-US">
												<o:p>
												</o:p>
										</span>
								</b>
						</p>
						<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">在规则语言中存在一些保留字。你应该避免使用这些保留字，来命名规则文本中的域对象，属性，方法，功能。保留字如下：</span>
						<span lang="EN-US">when </span>
						<span style="FONT-FAMILY: 宋体">，</span>
						<span lang="EN-US">then</span>
						<span style="FONT-FAMILY: 宋体">，</span>
						<span lang="EN-US">rule</span>
						<span style="FONT-FAMILY: 宋体">，</span>
						<span lang="EN-US">end</span>
						<span style="FONT-FAMILY: 宋体">，</span>
						<span lang="EN-US">contains</span>
						<span style="FONT-FAMILY: 宋体">，</span>
						<span lang="EN-US">matches</span>
						<span style="FONT-FAMILY: 宋体">，</span>
						<span lang="EN-US">and</span>
						<span style="FONT-FAMILY: 宋体">，</span>
						<span lang="EN-US">or</span>
						<span style="FONT-FAMILY: 宋体">，</span>
						<span lang="EN-US">modify</span>
						<span style="FONT-FAMILY: 宋体">，</span>
						<span lang="EN-US">retract</span>
						<span style="FONT-FAMILY: 宋体">，</span>
						<span lang="EN-US">assert</span>
						<span style="FONT-FAMILY: 宋体">，</span>
						<span lang="EN-US">salience</span>
						<span style="FONT-FAMILY: 宋体">，</span>
						<span lang="EN-US">function</span>
						<span style="FONT-FAMILY: 宋体">，</span>
						<span lang="EN-US">query</span>
						<span style="FONT-FAMILY: 宋体">，</span>
						<span lang="EN-US">exists</span>
						<span style="FONT-FAMILY: 宋体">，</span>
						<span lang="EN-US">eval</span>
						<span style="FONT-FAMILY: 宋体">，</span>
						<span lang="EN-US">agenda-group</span>
						<span style="FONT-FAMILY: 宋体">，</span>
						<span lang="EN-US">no-loop</span>
						<span style="FONT-FAMILY: 宋体">，</span>
						<span lang="EN-US">duration</span>
						<span style="FONT-FAMILY: 宋体">，</span>
						<span lang="EN-US">-&gt;</span>
						<span style="FONT-FAMILY: 宋体">，</span>
						<span lang="EN-US">not</span>
						<span style="FONT-FAMILY: 宋体">，</span>
						<span lang="EN-US">auto-focus </span>
						<span style="FONT-FAMILY: 宋体">。</span>
						<br />
						<br />
						<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">&lt;!--[if !supportLists]--&gt; <b><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black">2. <span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">  </span></span></b>&lt;!--[endif]--&gt; <b><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体">注释</span></b><b><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black"><o:p></o:p></span></b></p>
						<b>
								<span lang="EN-US" style="COLOR: black">2.1 </span>
						</b>
						<b>
								<span style="COLOR: black; FONT-FAMILY: 宋体">单行注释：</span>
						</b>
						<br />
						<div align="center">
								<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_single_line_comment.png" />
								<br />
								<p class="MsoNormal" style="TEXT-ALIGN: center" align="center">
										<b>
												<span lang="EN-US">
														<font size="2">Figure 2.1. Single line comment</font>
												</span>
										</b>
								</p>
						</div>
				</div>
		</div>
		<b>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">2.2 </span>
				<span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">多行注释：<br /></span>
		</b>
		<div align="center">
				<b>
						<span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">
								<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_multi_line_comment.png" />
								<br />
						</span>
				</b>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Figure 2.2. Multi line comment<br /></span>
				</b>
				<div align="left">
						<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">&lt;!--[if !supportLists]--&gt; <b><span lang="EN-US" style="FONT-SIZE: 12pt"><br /></span></b></p>
						<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">
								<b>
										<span lang="EN-US" style="FONT-SIZE: 12pt">3.<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">     </span></span>
								</b>&lt;!--[endif]--&gt; <b><span lang="EN-US" style="FONT-SIZE: 12pt">Package<o:p></o:p></span></b></p>
						<p class="MsoNormal">
								<span style="COLOR: black; FONT-FAMILY: 宋体">一个包是</span>
								<span lang="EN-US" style="COLOR: black">rule</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">和其他相关结构，像</span>
								<span lang="EN-US" style="COLOR: black">import</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">和</span>
								<span lang="EN-US" style="COLOR: black">global</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">的集合。</span>
								<span lang="EN-US" style="COLOR: black">Package</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">的成员之间通常都是相关联的。一个</span>
								<span lang="EN-US" style="COLOR: black">Package</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">代表了一个命名空间（</span>
								<span lang="EN-US" style="COLOR: black">namespace</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">），用来使给定的规则组之间保持唯一性。</span>
								<span lang="EN-US" style="COLOR: black">Package</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">的名字本身就是命名空间，并且与文件或文件夹并无关联。</span>
								<span lang="EN-US" style="COLOR: black">
										<o:p>
										</o:p>
								</span>
						</p>
						<p class="MsoNormal">
								<span lang="EN-US" style="COLOR: black">&lt;!--[if !supportEmptyParas]--&gt; <o:p></o:p></span>
						</p>
						<p class="MsoNormal">
								<span style="COLOR: black; FONT-FAMILY: 宋体">可以将来自不同规则源的规则装配在一起，前提是这些规则必须处在同一个命名空间中。尽管如此，一个通常的结构是将处于同一个命名空间中的所有规则都放在同一个相同的文件中。</span>
								<span lang="EN-US" style="COLOR: black">
										<o:p>
										</o:p>
								</span>
						</p>
						<p class="MsoNormal">
								<span style="COLOR: black; FONT-FAMILY: 宋体">下面的</span>
								<span lang="EN-US" style="COLOR: black">rail-road</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">图显示了组成一个</span>
								<span lang="EN-US" style="COLOR: black">Package</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">的所有组件。注意：一个</span>
								<span lang="EN-US" style="COLOR: black">package</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">必须有一个命名空间，并且采用</span>
								<span lang="EN-US" style="COLOR: black">Java</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">包名的约定。在一个规则文件中，各组件出现的位置是任意的，除了“</span>
								<span lang="EN-US" style="COLOR: black">package</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">”和“</span>
								<span lang="EN-US" style="COLOR: black">expander</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">”语句必须出现在任何一个规则之前，放在文件的顶部。在任何情况下，分号都是可选的。</span>
								<span lang="EN-US" style="COLOR: black">
										<o:p>
										</o:p>
								</span>
						</p>
						<div align="center">
								<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_package.png" />
								<br />
								<b>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">
										</span>
								</b>
						</div>
				</div>
				<b>
						<span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">
						</span>
				</b>
		</div>
		<div align="center">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Figure 3.1. package<br /></span>
				</b>
				<div align="left">
						<b>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">3.1 import<br /></span>
						</b>
						<div align="center">
								<b>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">
												<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_import.png" />
												<br />
										</span>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Figure 3.2. import<br /></span>
								</b>
								<div align="left">
										<p class="MsoNormal">
												<span lang="EN-US">Import</span>
												<span style="FONT-FAMILY: 宋体">语句的使用很像</span>
												<span lang="EN-US">Java</span>
												<span style="FONT-FAMILY: 宋体">中的</span>
												<span lang="EN-US">import</span>
												<span style="FONT-FAMILY: 宋体">语句。你需要为你要在规则中使用的对象，指定完整的路径和类名。</span>
												<span lang="EN-US">Drools</span>
												<span style="FONT-FAMILY: 宋体">自动从相同命名的</span>
												<span lang="EN-US">java</span>
												<span style="FONT-FAMILY: 宋体">包中引入所需的类。</span>
										</p>
										<p class="MsoNormal">
												<b>
														<span lang="EN-US">
																<font size="2">3.2 expander</font>
														</span>
												</b>
										</p>
										<p class="MsoNormal" align="center">
												<b>
														<span lang="EN-US">
																<font size="2">
																		<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_expander.png" />
																</font>
														</span>
												</b>
										</p>
										<p class="MsoNormal" align="center">
												<b>
														<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Figure 3.3. expander</span>
												</b>
										</p>
										<p class="MsoNormal" align="left">
										</p>
										<p class="MsoNormal">
												<span lang="EN-US">expander</span>
												<span style="FONT-FAMILY: 宋体">语句是可选的，是用来指定</span>
												<span lang="EN-US">Domain Specific Language</span>
												<span style="FONT-FAMILY: 宋体">的配置（通常是一个</span>
												<span lang="EN-US">.dsl</span>
												<span style="FONT-FAMILY: 宋体">文件）。这使得解析器可以理解用你自己的</span>
												<span lang="EN-US">DSL</span>
												<span style="FONT-FAMILY: 宋体">语言所写的规则。</span>
										</p>
										<b>
												<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">3.3 global<br /><br /></span>
										</b>
										<div align="center">
												<b>
														<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">
																<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_global.png" />
														</span>
												</b>
												<br />
												<b>
														<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">
														</span>
												</b>
										</div>
								</div>
								<b>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">
										</span>
								</b>
						</div>
						<div align="center">
								<b>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Figure 3.4. global</span>
								</b>
						</div>
						<p class="MsoNormal">
								<span lang="EN-US">Global</span>
								<span style="FONT-FAMILY: 宋体">就是全局变量。如果多个</span>
								<span lang="EN-US">package</span>
								<span style="FONT-FAMILY: 宋体">声明了具有相同标识符的</span>
								<span lang="EN-US">global</span>
								<span style="FONT-FAMILY: 宋体">，那么它们必需是相同的类型，并且所有的引用都是相同的。它们通常用来返回数据，比如</span>
								<span lang="EN-US">actions</span>
								<span style="FONT-FAMILY: 宋体">的日志，或者为</span>
								<span lang="EN-US">rules</span>
								<span style="FONT-FAMILY: 宋体">提供所需的数据或服务。</span>
								<span lang="EN-US">global</span>
								<span style="FONT-FAMILY: 宋体">并不是通过</span>
								<span lang="EN-US">assert</span>
								<span style="FONT-FAMILY: 宋体">动作放入</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">的，所有当</span>
								<span lang="EN-US">global</span>
								<span style="FONT-FAMILY: 宋体">发生改变时，引擎将不会知道。所以，</span>
								<span lang="EN-US">global</span>
								<span style="FONT-FAMILY: 宋体">不能作为约束条件，除非它们的值是</span>
								<span lang="EN-US">final</span>
								<span style="FONT-FAMILY: 宋体">的。将</span>
								<span lang="EN-US">global</span>
								<span style="FONT-FAMILY: 宋体">错误的使用在约束条件中，会产生令人惊讶的错误结果。</span>
						</p>
						<p class="MsoNormal">
								<span lang="EN-US">&lt;!--[if !supportEmptyParas]--&gt; </span>
						</p>
						<p class="MsoNormal">
								<span style="FONT-FAMILY: 宋体">注意：</span>
								<span lang="EN-US">global</span>
								<span style="FONT-FAMILY: 宋体">只是从你的</span>
								<span lang="EN-US">application</span>
								<span style="FONT-FAMILY: 宋体">中传入</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">的对象的命名实例。这意味着你可以传入任何你想要的对象。你可以传入一个</span>
								<span lang="EN-US">service locator</span>
								<span style="FONT-FAMILY: 宋体">，或者是一个</span>
								<span lang="EN-US">service</span>
								<span style="FONT-FAMILY: 宋体">本身。</span>
								<span lang="EN-US" style="COLOR: black">
										<o:p>
										</o:p>
								</span>
						</p>
						<p class="MsoNormal">
								<b>
										<span lang="EN-US" style="COLOR: black">&lt;!--[if !supportEmptyParas]--&gt; </span>
								</b>
						</p>
						<p class="MsoNormal">
								<span style="COLOR: black; FONT-FAMILY: 宋体">下面的例子中，有一个</span>
								<span lang="EN-US" style="COLOR: black">EmailService</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">的实例。在你调用规则引擎的代码中，你有一个</span>
								<span lang="EN-US" style="COLOR: black">EmailService</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">对象，然后把它放入</span>
								<span lang="EN-US" style="COLOR: black">WorkingMemory</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">。在</span>
								<span lang="EN-US" style="COLOR: black">DRL</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">文件中，你声明了一个类型为</span>
								<span lang="EN-US" style="COLOR: black">EmailService</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">的</span>
								<span lang="EN-US" style="COLOR: black">global</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">，然后将它命名为“</span>
								<span lang="EN-US" style="COLOR: black">email</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">”，像这样：</span>
								<span lang="EN-US" style="COLOR: black">global EmailService email</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">；。然后在你的规则的</span>
								<span lang="EN-US" style="COLOR: black">RHS</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">中，你可以使用它，像这样：</span>
								<span lang="EN-US" style="COLOR: black">email.sendSMS(number,message)</span>
								<span style="COLOR: black; FONT-FAMILY: 宋体">等等。</span>
								<span lang="EN-US" style="COLOR: black">
										<o:p>
										</o:p>
								</span>
						</p>
						<p class="MsoNormal">
						</p>
						<p class="MsoNormal">
								<b>
										<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black">4. Function</span>
								</b>
								<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black">
										<o:p>
										</o:p>
								</span>
						</p>
						<div align="center">
								<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_function.png" />
								<br />
								<b>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Figure 4.1. function</span>
								</b>
								<br />
								<div align="left">
										<p class="MsoNormal">
												<span lang="EN-US">Function</span>
												<span style="FONT-FAMILY: 宋体">是将代码放到你的规则源中的一种方法。它们只能做类似</span>
												<span lang="EN-US">Helper</span>
												<span style="FONT-FAMILY: 宋体">类做的事（实际上编译器在背后帮你生成了</span>
												<span lang="EN-US">Helper</span>
												<span style="FONT-FAMILY: 宋体">类）。在一个</span>
												<span lang="EN-US">rule</span>
												<span style="FONT-FAMILY: 宋体">中使用</span>
												<span lang="EN-US">function</span>
												<span style="FONT-FAMILY: 宋体">的主要优势是，你可以保持所有的逻辑都在一个地方，并且你可以根据需要来改变</span>
												<span lang="EN-US">function</span>
												<span style="FONT-FAMILY: 宋体">（这可能是好事也可能是坏事）。</span>
												<span lang="EN-US">Function</span>
												<span style="FONT-FAMILY: 宋体">最有用的就是在规则的</span>
												<span lang="EN-US">RHS</span>
												<span style="FONT-FAMILY: 宋体">调用</span>
												<span lang="EN-US">actions</span>
												<span style="FONT-FAMILY: 宋体">，特别是当那个</span>
												<span lang="EN-US">action</span>
												<span style="FONT-FAMILY: 宋体">需要反复调用的时候。</span>
										</p>
										<p class="MsoNormal">
												<span lang="EN-US">&lt;!--[if !supportEmptyParas]--&gt; </span>
										</p>
										<p class="MsoNormal">
												<span style="FONT-FAMILY: 宋体">一个典型的</span>
												<span lang="EN-US">function</span>
												<span style="FONT-FAMILY: 宋体">声明如下：</span>
										</p>
										<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
												<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
												<span style="COLOR: rgb(0,0,0)">function String calcSomething(String arg) {<br /></span>
												<span style="COLOR: rgb(0,0,255)">return</span>
												<span style="COLOR: rgb(0,0,0)"> </span>
												<span style="COLOR: rgb(0,0,0)">"</span>
												<span style="COLOR: rgb(0,0,0)">hola !</span>
												<span style="COLOR: rgb(0,0,0)">"</span>
												<span style="COLOR: rgb(0,0,0)">;<br />}<br /><br /></span>
										</div>
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">&lt;!--[if !supportEmptyParas]--&gt; <o:p></o:p></span>
										</p>
										<p class="MsoNormal">
												<span style="COLOR: black; FONT-FAMILY: 宋体">注意：“</span>
												<span lang="EN-US" style="COLOR: black">function</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">”关键字的使用，它并不真正是</span>
												<span lang="EN-US" style="COLOR: black">Java</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">的一部分。而</span>
												<span lang="EN-US" style="COLOR: black">function</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">的参数就像是一个普通的</span>
												<span lang="EN-US" style="COLOR: black">method</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">（如果不需要参数就不用写）。返回类型也跟普通的</span>
												<span lang="EN-US" style="COLOR: black">method</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">一样。在一条规则（在它的</span>
												<span lang="EN-US" style="COLOR: black">RHS</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">中，或可能是一个</span>
												<span lang="EN-US" style="COLOR: black">eval</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">）中调用</span>
												<span lang="EN-US" style="COLOR: black">function</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">，就像调用一个</span>
												<span lang="EN-US" style="COLOR: black">method</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">一样，只需要</span>
												<span lang="EN-US" style="COLOR: black">function</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">的名字，并传给它参数。</span>
												<span lang="EN-US" style="COLOR: black">
														<o:p>
														</o:p>
												</span>
										</p>
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">&lt;!--[if !supportEmptyParas]--&gt; </span>
										</p>
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">function</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">的替代品，可以使用一个</span>
												<span lang="EN-US" style="COLOR: black">Helper</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">类中的静态方法：</span>
												<span lang="EN-US" style="COLOR: black">Foo.doSomething()</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">，或者以</span>
												<span lang="EN-US" style="COLOR: black">global</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">的方式传入一个</span>
												<span lang="EN-US" style="COLOR: black">Helper</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">类或服务的实例：</span>
												<span lang="EN-US" style="COLOR: black">foo.doSomething()</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">（</span>
												<span lang="EN-US" style="COLOR: black">foo</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">是一个命名的</span>
												<span lang="EN-US" style="COLOR: black">global</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">变量）。</span>
												<span lang="EN-US" style="COLOR: black">
														<o:p>
														</o:p>
												</span>
										</p>
										<p class="MsoNormal">
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black">&lt;!--[if !supportEmptyParas]--&gt; <br /></span>
										</p>
								</div>
						</div>
				</div>
		</div>
<img src ="http://www.blogjava.net/clant/aggbug/85146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clant/" target="_blank">BPM </a> 2006-12-03 09:56 <a href="http://www.blogjava.net/clant/articles/85146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（七）: Drools规则语言详解（下） </title><link>http://www.blogjava.net/clant/articles/85147.html</link><dc:creator>BPM </dc:creator><author>BPM </author><pubDate>Sun, 03 Dec 2006 01:56:00 GMT</pubDate><guid>http://www.blogjava.net/clant/articles/85147.html</guid><wfw:comment>http://www.blogjava.net/clant/comments/85147.html</wfw:comment><comments>http://www.blogjava.net/clant/articles/85147.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clant/comments/commentRss/85147.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clant/services/trackbacks/85147.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Drools规则语言详解（下） 																				5. Rule																																																																																																						Figure 5.1. r...&nbsp;&nbsp;<a href='http://www.blogjava.net/clant/articles/85147.html'>阅读全文</a><img src ="http://www.blogjava.net/clant/aggbug/85147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clant/" target="_blank">BPM </a> 2006-12-03 09:56 <a href="http://www.blogjava.net/clant/articles/85147.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（五）: JBoss Rules 3.0.1 类库介绍 </title><link>http://www.blogjava.net/clant/articles/85145.html</link><dc:creator>BPM </dc:creator><author>BPM </author><pubDate>Sun, 03 Dec 2006 01:55:00 GMT</pubDate><guid>http://www.blogjava.net/clant/articles/85145.html</guid><wfw:comment>http://www.blogjava.net/clant/comments/85145.html</wfw:comment><comments>http://www.blogjava.net/clant/articles/85145.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clant/comments/commentRss/85145.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clant/services/trackbacks/85145.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">下载地址：</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<a href="http://labs.jboss.com/portal/index.html?ctrl:id=page.default.downloads&amp;project=jbossrules">
								<font color="#009933">http://labs.jboss.com/portal/index.html?ctrl:id=page.default.downloads&amp;project=jbossrules</font>
						</a>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">下载文件说明：</span>
		</p>
		<p class="MsoNormal">
				<b>
						<span lang="EN-US">JBoss Rules 3.0.1 Binaries (includes javadocs)</span>
				</b>
				<b>
						<span style="FONT-FAMILY: 宋体">（</span> 13MB</b>
				<b>
						<span style="FONT-FAMILY: 宋体">）―</span>
				</b>
				<span style="FONT-FAMILY: 宋体">仅仅包含</span>
				<span lang="EN-US">JBoss Rules</span>
				<span style="FONT-FAMILY: 宋体">的四个核心类库：</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">drools-core.jar</span><span style="FONT-FAMILY: 宋体">－</span><span style="FONT-FAMILY: 宋体">核心引擎，运行时组件。包含了</span><span lang="EN-US">RETE</span><span style="FONT-FAMILY: 宋体">引擎和</span><span lang="EN-US">LEAPS</span><span style="FONT-FAMILY: 宋体">引擎；</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">drools-compiler.jar</span><span style="FONT-FAMILY: 宋体">－</span><span style="FONT-FAMILY: 宋体">规则文件的编译组件，构建可执行的</span><span lang="EN-US">RuleBase</span><span style="FONT-FAMILY: 宋体">；</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">drools-jsr94.jar</span><span style="FONT-FAMILY: 宋体">－</span><span style="FONT-FAMILY: 宋体">提供了</span><span lang="EN-US">JSR-94</span><span style="FONT-FAMILY: 宋体">的兼容实现，本质上是</span><span lang="EN-US">drools- compiler</span><span style="FONT-FAMILY: 宋体">组件的包裹层。注意：由于</span><span lang="EN-US">JSR94</span><span style="FONT-FAMILY: 宋体">规约的限制，不是所有的特点都可以通过此接口暴露。</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">drools-decisiontables.jar</span><span style="FONT-FAMILY: 宋体">－</span><span style="FONT-FAMILY: 宋体">决策表的“编译”组件（使用了</span><span lang="EN-US">drools- compiler</span><span style="FONT-FAMILY: 宋体">组件）。支持</span><span lang="EN-US">excel</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">CSV</span><span style="FONT-FAMILY: 宋体">输入格式。</span></p>
		<p class="MsoNormal">
				<b>
						<span lang="EN-US">JBoss Rules 3.0.1 Binaries with dependencies (includes javadocs)</span>
				</b>
				<b>
						<span style="FONT-FAMILY: 宋体">（</span> 23<span lang="EN-US"> MB</span></b>
				<b>
						<span style="FONT-FAMILY: 宋体">）－</span>
				</b>
				<span style="FONT-FAMILY: 宋体">包含了</span>
				<span lang="EN-US">JBoss Rules</span>
				<span style="FONT-FAMILY: 宋体">的核心类库和它们的</span>
				<span lang="EN-US">dependencies</span>
				<span style="FONT-FAMILY: 宋体">：</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">antlr-2.7.6.jar</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">antlr-3.0ea8.jar</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">colt-1.2.0.jar</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">commons-collections-3.1.jar</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">commons-io-1.1.jar</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">commons-jci-core-1.0-406301.jar</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">commons-jci-eclipse-3.2.0.666.jar</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">commons-jci-janino-2.4.3.jar</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">commons-lang-2.1.jar</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">commons-logging-api-1.0.4.jar</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">concurrent-1.3.4.jar</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">core-3.2.0.666.jar</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">janino-2.4.3.jar</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">jsr94-1.1.jar</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">jung-1.7.2.jar</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">junit-3.8.1.jar</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">poi-2.5.1-final-20040804.jar</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">stringtemplate-2.3b6.jar</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">xercesImpl-2.6.2.jar</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">xml-apis-1.0.b2.jar</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">xpp3-1.1.3.4.0.jar</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-FAMILY: Wingdings">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">xstream-1.1.3.jar</span></p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">如果你运行在</span>
				<span lang="EN-US">Java 1.5</span>
				<span style="FONT-FAMILY: 宋体">环境下，有一些类库，例如</span>
				<span lang="EN-US">XML libraries</span>
				<span style="FONT-FAMILY: 宋体">，可以不需要。需要注意的类库有：</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">“</span>
				<span lang="EN-US">JCI</span>
				<span style="FONT-FAMILY: 宋体">”－这是</span>
				<span lang="EN-US">Apache Java Compiler Interface ,</span>
				<span style="FONT-FAMILY: 宋体">提供了运行时编译能力。可以通过</span>
				<span lang="EN-US" style="COLOR: black">PackageBuilderConfiguration</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">实例来设定采用</span>
				<span lang="EN-US" style="COLOR: black">eclipse</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">或</span>
				<span lang="EN-US" style="COLOR: black">janino</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">编译器，默认是</span>
				<span lang="EN-US" style="COLOR: black">eclipse</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">；</span>
				<span lang="EN-US" style="COLOR: black">
						<?XML:NAMESPACE PREFIX = O /?>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">“</span>
				<span lang="EN-US">POI</span>
				<span style="FONT-FAMILY: 宋体">”－提供了解析</span>
				<span lang="EN-US">Excel</span>
				<span style="FONT-FAMILY: 宋体">文件的能力；</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">“</span>
				<span lang="EN-US">antlr</span>
				<span style="FONT-FAMILY: 宋体">”－提供了解析规则语言的能力。</span>
		</p>
		<p class="MsoNormal">
				<b>
						<span lang="EN-US">JBoss Rules IDE 3.0.1 </span>
				</b>
				<b>
						<span style="FONT-FAMILY: 宋体">（</span>
						<span lang="EN-US">13 MB</span>
				</b>
				<b>
						<span style="FONT-FAMILY: 宋体">）－</span>
				</b>
				<span style="FONT-FAMILY: 宋体">这是</span>
				<span lang="EN-US">JBoss Rules</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US">Eclipse</span>
				<span style="FONT-FAMILY: 宋体">插件，只支持</span>
				<span lang="EN-US">Eclipse 3.2</span>
				<span style="FONT-FAMILY: 宋体">或以上版本。它提供了运行</span>
				<span lang="EN-US">JBoss Rules</span>
				<span style="FONT-FAMILY: 宋体">的所有</span>
				<span lang="EN-US">dependencies</span>
				<span style="FONT-FAMILY: 宋体">。你可以创建一个</span>
				<span lang="EN-US">Rule Project</span>
				<span style="FONT-FAMILY: 宋体">，它能够为你编写规则文件提供自动完成的功能，并且它为你提供了</span>
				<span lang="EN-US">Agenda view</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">WorkingMemory view</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">Global Data view </span>
				<span style="FONT-FAMILY: 宋体">，使你可以通过</span>
				<span lang="EN-US">eclipse</span>
				<span style="FONT-FAMILY: 宋体">视图很清楚的看到</span>
				<span lang="EN-US">Agenda</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">WorkingMemory</span>
				<span style="FONT-FAMILY: 宋体">和</span>
				<span lang="EN-US">Global Data</span>
				<span style="FONT-FAMILY: 宋体">的情况。</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">你还可以通过</span>
				<span lang="EN-US">update site</span>
				<span style="FONT-FAMILY: 宋体">来自动安装这个插件</span>
				<span lang="EN-US">,URL</span>
				<span style="FONT-FAMILY: 宋体">是：</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">http://anonsvn.labs.jboss.com/labs/jbossrules/updates/drools-ide-update/</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;<o:p></o:p></span>
		</p>
<img src ="http://www.blogjava.net/clant/aggbug/85145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clant/" target="_blank">BPM </a> 2006-12-03 09:55 <a href="http://www.blogjava.net/clant/articles/85145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（三）: Drools规则引擎 （上） </title><link>http://www.blogjava.net/clant/articles/85143.html</link><dc:creator>BPM </dc:creator><author>BPM </author><pubDate>Sun, 03 Dec 2006 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/clant/articles/85143.html</guid><wfw:comment>http://www.blogjava.net/clant/comments/85143.html</wfw:comment><comments>http://www.blogjava.net/clant/articles/85143.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clant/comments/commentRss/85143.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clant/services/trackbacks/85143.html</trackback:ping><description><![CDATA[
		<font face="Georgia">从今天开始，我们将分两期来详细的介绍Drools规则引擎的原理，和各关键类的使用方法。<br /><br /></font>
		<div align="center">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 14pt; FONT-FAMILY: 'Times New Roman'">Drools</span>
						<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体">规则引擎(上)<br /></span>
				</b>
		</div>
		<font face="Georgia">
				<br />
		</font>
		<b>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">1. 概述</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman'">:<br /></span>
		</b>
		<font size="3">
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Drools</span>
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">分为两个主要部分：构建（</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Authoring</span>
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">）和运行时（</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Runtime</span>
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">）。<br /><br /></span>
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">构建的过程涉及到</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">.drl</span>
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">或</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">.xml</span>
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">规则文件的创建，它们被读入一个解析器，使用</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">ANTLR 3 </span>
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">语法进行解析。解析器对语法进行正确性的检查，然后产生一种中间结构“</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">descr</span>
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">”，</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">descr</span>
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">用</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">AST</span>
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">来描述规则。</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">AST</span>
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">然后被传到</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">PackageBuilder</span>
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">，由</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">PackagBuilder</span>
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">来产生</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Packaged</span>
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">对象。</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">PackageBuilder</span>
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">还承担着一些代码产生和编译的工作，这些对于产生</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Package</span>
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">对象都时必需的。</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Package</span>
		</font>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">
				<font size="3">对象是一个可以配置的，可序列化的，由一个或多个规则组成的对象。下图阐明了上述过程：</font>
				<br />
		</span>
		<div align="center">  <span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体"><img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_Authoring.png" /><br /><b>Figure 1.1 </b></span><b><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Authoring Components<br /></span></b><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体"></span></div>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">
				<br />
		</span>
		<p class="MsoNormal">
				<font size="3">
						<span lang="EN-US">RuleBase</span>
						<span style="FONT-FAMILY: 宋体">是一个运行时组件，它包含了一个或多个</span>
						<span lang="EN-US">Package</span>
						<span style="FONT-FAMILY: 宋体">对象。可以在任何时刻将一个</span>
						<span lang="EN-US">Package</span>
						<span style="FONT-FAMILY: 宋体">对象加入或移出</span>
						<span lang="EN-US">RuleBase</span>
						<span style="FONT-FAMILY: 宋体">对象。一个</span>
						<span lang="EN-US">RuleBase</span>
						<span style="FONT-FAMILY: 宋体">对象可以在任意时刻实例化一个或多个</span>
						<span lang="EN-US">WorkingMemory</span>
						<span style="FONT-FAMILY: 宋体">对象，在它的内部保持对这些</span>
						<span lang="EN-US">WorkingMemory</span>
						<span style="FONT-FAMILY: 宋体">的弱引用。</span>
						<span lang="EN-US">WorkingMemory</span>
						<span style="FONT-FAMILY: 宋体">由一系列子组件组成。当应用程序中的对象被</span>
						<span lang="EN-US">assert</span>
						<span style="FONT-FAMILY: 宋体">进</span>
						<span lang="EN-US">WorkingMemory</span>
						<span style="FONT-FAMILY: 宋体">，可能会导致一个或多个</span>
						<span lang="EN-US">Activation</span>
						<span style="FONT-FAMILY: 宋体">的产生，然后由</span>
						<span lang="EN-US">Agenda</span>
						<span style="FONT-FAMILY: 宋体">负责安排这些</span>
						<span lang="EN-US">Activation</span>
						<span style="FONT-FAMILY: 宋体">的执行。下图说明了上述过程：</span>
				</font>
		</p>
		<div align="center">  <font size="3"><img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_Runtime.png" /><br /></font><div align="center"><b><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Figure 1.2 . Runtime Components<br /></span></b><div align="left"><b><br /></b><p class="MsoNormal"><b><span lang="EN-US" style="FONT-SIZE: 12pt">2</span></b><b><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">．构建（</span></b><b><span lang="EN-US" style="FONT-SIZE: 12pt">Authoring</span></b><b><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">）：</span></b><b><span lang="EN-US" style="FONT-SIZE: 12pt"><?XML:NAMESPACE PREFIX = O /?><o:p></o:p></span></b></p><p class="MsoNormal" style="TEXT-ALIGN: left" align="left"><span style="FONT-FAMILY: 宋体">主要有三个类用来完成构建过程：</span><span lang="EN-US">DrlParser, XmlParser </span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US"> PackageBuilder</span><span style="FONT-FAMILY: 宋体">。两个解析器类从传入的</span><span lang="EN-US">Reader</span><span style="FONT-FAMILY: 宋体">实例产生</span><span lang="EN-US">descr AST</span><span style="FONT-FAMILY: 宋体">模型。</span><span lang="EN-US">PackageBuilder</span><span style="FONT-FAMILY: 宋体">提供了简便的</span><span lang="EN-US">API</span><span style="FONT-FAMILY: 宋体">，使你可以忽略那两个类的存在。这两个简单的方法是：“</span><span lang="EN-US">addPackageFromDrl</span><span style="FONT-FAMILY: 宋体">”和“</span><span lang="EN-US">addPackageFromXml</span><span style="FONT-FAMILY: 宋体">”，两个都只要传入一个</span><span lang="EN-US">Reader</span><span style="FONT-FAMILY: 宋体">实例作为参数。下面的例子说明了如何从</span><span lang="EN-US">classpath</span><span style="FONT-FAMILY: 宋体">中的</span><span lang="EN-US">xml</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">drl</span><span style="FONT-FAMILY: 宋体">文件创建一个</span><span lang="EN-US">Package</span><span style="FONT-FAMILY: 宋体">对象。注意：所有传入同一个</span><span lang="EN-US">PackageBuilder</span><span style="FONT-FAMILY: 宋体">实例的规则源，都必须是在相同的</span><span lang="EN-US">package </span><span style="FONT-FAMILY: 宋体">命名空间（</span><span lang="EN-US">namespace</span><span style="FONT-FAMILY: 宋体">）中。</span></p><p class="MsoNormal" style="TEXT-ALIGN: left" align="left"><span style="FONT-FAMILY: 宋体"></span></p><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,0)">PackageBuilder builder </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> PackageBuilder();<br />builder.addPackageFromDrl( </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> InputStreamReader( getClass().getResourceAsStream( </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">package1.drl</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> ) ) );<br />builder.addPackageFromXml( </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> InputStreamReader( getClass().getResourceAsStream( </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">package2.drl</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> ) ) );<br />Package pkg </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> builder.getPackage();<br /></span></div><p></p><div align="center"><span style="FONT-FAMILY: 宋体"><img height="645" src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_PackageBuilder.png" width="656" /><br /></span><b><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Figure 2.1 PackageBuilder<br /></span></b><div align="left"><p class="MsoNormal"><span lang="EN-US">PackageBuilder</span><span style="FONT-FAMILY: 宋体">是可以配置的，使用</span><span lang="EN-US">PackageBuilderConfiguration</span><span style="FONT-FAMILY: 宋体">。通常，你可以指定另一个</span><span lang="EN-US">parent ClassLoader</span><span style="FONT-FAMILY: 宋体">和用什么编译器（</span><span lang="EN-US">compiler</span><span style="FONT-FAMILY: 宋体">），默认是</span><span lang="EN-US">Eclipse JDT</span><span style="FONT-FAMILY: 宋体">。下面显示了如何指定</span><span lang="EN-US">JANINO</span><span style="FONT-FAMILY: 宋体">编译器：</span></p><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,0)">PackageBuilderConfiguration conf </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> PackageBuilderConfiguration();<br />conf.setCompiler( PackageBuilderConfiguration.JANINO );<br />PackageBuilder builder </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> PackageBuilder( conf );<br /></span></div><div align="center"><img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_PackageBuilderConfiguration.png" /><br /><b><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Figure 2.2 . PackageBuilderConfiguration<br /></span></b><div align="left"><b><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman'"><br />3</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">．</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman'">RuleBase:<br /></span></b><div align="center"><b><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman'"><img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_RuleBase.png" /><br /></span></b><b><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Figure 3.1 . RuleBase<br /></span></b><div align="left"><b><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'"></span></b><p class="MsoNormal"><span style="FONT-FAMILY: 宋体">一个</span><span lang="EN-US">RuleBase</span><span style="FONT-FAMILY: 宋体">包含了多个将被使用的规则包（</span><span lang="EN-US">packages of rules</span><span style="FONT-FAMILY: 宋体">）。一个</span><span lang="EN-US">RuleBase</span><span style="FONT-FAMILY: 宋体">是可以序列化的，所以它可以被配置到</span><span lang="EN-US">JNDI</span><span style="FONT-FAMILY: 宋体">或其他类似的服务。通常，第一次使用时，一个</span><span lang="EN-US">RuleBase</span><span style="FONT-FAMILY: 宋体">被创建并缓存。</span><span lang="EN-US">RuleBase</span><span style="FONT-FAMILY: 宋体">用</span><span lang="EN-US">RuleBaseFactory</span><span style="FONT-FAMILY: 宋体">来实例化，默认返回一个</span><span lang="EN-US">ReteOO RuleBase</span><span style="FONT-FAMILY: 宋体">。可以传入参数来指定采用</span><span lang="EN-US">ReteOO</span><span style="FONT-FAMILY: 宋体">或</span><span lang="EN-US">Leaps</span><span style="FONT-FAMILY: 宋体">。然后，用</span><span lang="EN-US">addPackage</span><span style="FONT-FAMILY: 宋体">方法加入</span><span lang="EN-US">Package</span><span style="FONT-FAMILY: 宋体">实例。你可以加入有相同命名空间（</span><span lang="EN-US">namespace</span><span style="FONT-FAMILY: 宋体">）的多个</span><span lang="EN-US">Package</span><span style="FONT-FAMILY: 宋体">。</span></p><b><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman'"></span></b></div></div></div></div><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,0)">RuleBase ruleBase  </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> RuleBaseFactory.newRuleBase();<br />ruleBase.addPackage(pkg);<br /></span></div></div></div></div></div></div>
		<div align="center">
				<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_RuleBaseFactory.png" />
				<br />
				<b>Figure 3.2. RuleBaseFactory<br /></b>
				<div align="left">
						<p class="MsoNormal">
								<span style="FONT-FAMILY: 宋体">一个</span>
								<span lang="EN-US">rulebase instance</span>
								<span style="FONT-FAMILY: 宋体">是线程安全的，所有你可以在你的应用中，让一个</span>
								<span lang="EN-US">rulebase instance</span>
								<span style="FONT-FAMILY: 宋体">在多个线程中共享。对于一个</span>
								<span lang="EN-US">rulebase</span>
								<span style="FONT-FAMILY: 宋体">的最通常的操作是产生一个新的</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">。</span>
						</p>
						<p class="MsoNormal">
								<span style="FONT-FAMILY: 宋体">这个</span>
								<span lang="EN-US">rulebase</span>
								<span style="FONT-FAMILY: 宋体">保持着到它所产生的</span>
								<span lang="EN-US">WorkingMemoryd</span>
								<span style="FONT-FAMILY: 宋体">的弱引用，所以在长时间运行的</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">中，如果</span>
								<span lang="EN-US">rules</span>
								<span style="FONT-FAMILY: 宋体">发生改变，这些</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">可以即使的根据最新的</span>
								<span lang="EN-US">rules</span>
								<span style="FONT-FAMILY: 宋体">进行更新，而不必重启</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">。你也可以指定</span>
								<span lang="EN-US">RuleBase</span>
								<span style="FONT-FAMILY: 宋体">不必保持一个弱引用，但是你要保证</span>
								<span lang="EN-US">RuleBase</span>
								<span style="FONT-FAMILY: 宋体">不用更新。</span>
						</p>
						<p class="MsoNormal">
								<span style="FONT-FAMILY: 宋体">
								</span>
						</p>
						<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
								<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
								<span style="COLOR: rgb(0,0,0)">ruleBase.newWorkingMemory();  </span>
								<span style="COLOR: rgb(0,128,0)">//</span>
								<span style="COLOR: rgb(0,128,0)"> maintains a weak reference.</span>
								<span style="COLOR: rgb(0,128,0)">
										<br />
								</span>
								<span style="COLOR: rgb(0,0,0)">ruleBase.newWorkingMemory( </span>
								<span style="COLOR: rgb(0,0,255)">false</span>
								<span style="COLOR: rgb(0,0,0)"> ); </span>
								<span style="COLOR: rgb(0,128,0)">//</span>
								<span style="COLOR: rgb(0,128,0)"> do not maintain a weak reference<br /></span>
						</div>
						<p>
						</p>
						<p class="MsoNormal">
								<span style="FONT-FAMILY: 宋体">任何时候，</span>
								<span lang="EN-US">Package</span>
								<span style="FONT-FAMILY: 宋体">可以被加入或移除；所有的改变都会被反映到现存的</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">中。不要忘了调用</span>
								<span lang="EN-US">fireAllRules()</span>
								<span style="FONT-FAMILY: 宋体">让</span>
								<span lang="EN-US">Activations</span>
								<span style="FONT-FAMILY: 宋体">激发。</span>
						</p>
						<p class="MsoNormal">
								<span style="FONT-FAMILY: 宋体">
								</span>
						</p>
						<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
								<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
								<span style="COLOR: rgb(0,0,0)">ruleBase.addPackage( pkg  );  </span>
								<span style="COLOR: rgb(0,128,0)">//</span>
								<span style="COLOR: rgb(0,128,0)"> Add a package instance</span>
								<span style="COLOR: rgb(0,128,0)">
										<br />
								</span>
								<span style="COLOR: rgb(0,0,0)">ruleBase.removePackage( </span>
								<span style="COLOR: rgb(0,0,0)">"</span>
								<span style="COLOR: rgb(0,0,0)">org.com.sample</span>
								<span style="COLOR: rgb(0,0,0)">"</span>
								<span style="COLOR: rgb(0,0,0)">  );  </span>
								<span style="COLOR: rgb(0,128,0)">//</span>
								<span style="COLOR: rgb(0,128,0)"> remove a package, and all its parts, </span>
								<span style="COLOR: rgb(0,128,0)">
								</span>
								<span style="COLOR: rgb(0,128,0)">by it's namespace</span>
								<span style="COLOR: rgb(0,128,0)">
										<br />
								</span>
								<span style="COLOR: rgb(0,0,0)">ruleBase.removeRule( </span>
								<span style="COLOR: rgb(0,0,0)">"</span>
								<span style="COLOR: rgb(0,0,0)">org.com.sample</span>
								<span style="COLOR: rgb(0,0,0)">"</span>
								<span style="COLOR: rgb(0,0,0)">, </span>
								<span style="COLOR: rgb(0,0,0)">"</span>
								<span style="COLOR: rgb(0,0,0)">my rule</span>
								<span style="COLOR: rgb(0,0,0)">"</span>
								<span style="COLOR: rgb(0,0,0)"> ); </span>
								<span style="COLOR: rgb(0,128,0)">//</span>
								<span style="COLOR: rgb(0,128,0)"> remove a specific rule from a </span>
								<span style="COLOR: rgb(0,128,0)">
								</span>
								<span style="COLOR: rgb(0,128,0)">namespace<br /></span>
						</div>
						<p>
						</p>
						<p class="MsoNormal">
								<span style="FONT-FAMILY: 宋体">虽然有删除一个单独规则的方法，但是却没有加入一个单独规则的方法（要达到这个目的只有加入一个只有一条规则的</span>
								<span lang="EN-US">package</span>
								<span style="FONT-FAMILY: 宋体">）。</span>
						</p>
						<p class="MsoNormal">
								<span lang="EN-US">&lt;!--[if !supportEmptyParas]--&gt; <o:p></o:p></span>
						</p>
						<p class="MsoNormal">
								<span lang="EN-US">RuleBaseConfigurator</span>
								<span style="FONT-FAMILY: 宋体">可以指定</span>
								<span lang="EN-US">RuleBase</span>
								<span style="FONT-FAMILY: 宋体">的附加行为。在加入</span>
								<span lang="EN-US">RuleBase</span>
								<span style="FONT-FAMILY: 宋体">后，</span>
								<span lang="EN-US">RuleBaseConfiguration</span>
								<span style="FONT-FAMILY: 宋体">就变成不可变对象。</span>
						</p>
						<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
								<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
								<span style="COLOR: rgb(0,0,0)">RuleBaseConfiguration conf </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> </span>
								<span style="COLOR: rgb(0,0,255)">new</span>
								<span style="COLOR: rgb(0,0,0)"> RuleBaseConfiguration();<br /><br />conf.setProperty( RuleBaseConfiguration.PROPERTY_ASSERT_BEHAVIOR,<br />                  RuleBaseConfiguration.WM_BEHAVIOR_EQUALITY );<br /><br />RuleBase ruleBase </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> </span>
								<span style="COLOR: rgb(0,0,255)">new</span>
								<span style="COLOR: rgb(0,0,0)"> ReteooRuleBase( conf );<br /></span>
						</div>
				</div>
		</div>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">两个主要的属性是：</span>
				<span lang="EN-US">PROPERT_ASSERT_BEHAVIOR</span>
				<span style="FONT-FAMILY: 宋体">和</span>
				<span lang="EN-US">PROPERTY_LOGICAL_OVERRIDE_BEHAVIOR</span>
				<span style="FONT-FAMILY: 宋体">（在以后的部分中会解释）。所有的属性值都是</span>
				<span lang="EN-US">RuleBaseConfiguration</span>
				<span style="FONT-FAMILY: 宋体">类中的静态域常量。</span>
		</p>
		<div align="center">
				<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_RuleBaseConfiguration.png" />
				<br />
				<b>Figure 3.3 RuleBaseConfiguration</b>
				<br />
				<br />
		</div>
<img src ="http://www.blogjava.net/clant/aggbug/85143.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clant/" target="_blank">BPM </a> 2006-12-03 09:54 <a href="http://www.blogjava.net/clant/articles/85143.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（四）: Drools规则引擎 （下） </title><link>http://www.blogjava.net/clant/articles/85144.html</link><dc:creator>BPM </dc:creator><author>BPM </author><pubDate>Sun, 03 Dec 2006 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/clant/articles/85144.html</guid><wfw:comment>http://www.blogjava.net/clant/comments/85144.html</wfw:comment><comments>http://www.blogjava.net/clant/articles/85144.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clant/comments/commentRss/85144.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clant/services/trackbacks/85144.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="TEXT-ALIGN: center" align="center">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 14pt">Drools</span>
				</b>
				<b>
						<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体">规则引擎(下)</span>
				</b>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 14pt">
								<?XML:NAMESPACE PREFIX = O /?>
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<b>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman'">4</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">．</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman'">WorkingMemory:<br /></span>
		</b>
		<div align="center">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman'">
								<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_WorkingMemory.png" />
								<br />Figure 4.1 WorkingMemory<br /></span>
				</b>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman'">
						</span>
						<br />
				</b>
				<div align="left">
						<p class="MsoNormal">
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">是运行时规则引擎的主要类。它保持了所有被</span>
								<span lang="EN-US">asserted</span>
								<span style="FONT-FAMILY: 宋体">进</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">的数据的引用，直到取消（</span>
								<span lang="EN-US">retracted</span>
								<span style="FONT-FAMILY: 宋体">）。</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">是有状态对象。它们的生命周期可长可短。如果从一个短生命周期的角度来同一个引擎进行交互，意味着你可以使用</span>
								<span lang="EN-US">RuleBase</span>
								<span style="FONT-FAMILY: 宋体">对象来为每个</span>
								<span lang="EN-US">session</span>
								<span style="FONT-FAMILY: 宋体">产生一个新的</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">，然后在结束</span>
								<span lang="EN-US">session</span>
								<span style="FONT-FAMILY: 宋体">后</span>
								<span lang="EN-US">discard</span>
								<span style="FONT-FAMILY: 宋体">这个</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">（产生一个</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">是一个廉价的操作）。另一种形式，就是在一个相当长的时间中（例如一个</span>
								<span lang="EN-US">conversation</span>
								<span style="FONT-FAMILY: 宋体">），保持一个</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">，并且对于新的</span>
								<span lang="EN-US">facts</span>
								<span style="FONT-FAMILY: 宋体">保持持续的更新。当你希望</span>
								<span lang="EN-US">dispose</span>
								<span style="FONT-FAMILY: 宋体">一个</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">的时候，最好的实践就是调用</span>
								<span lang="EN-US">dispose()</span>
								<span style="FONT-FAMILY: 宋体">方法，此时</span>
								<span lang="EN-US">RuleBase</span>
								<span style="FONT-FAMILY: 宋体">中对它的引用将会被移除（尽管这是一个弱引用）。不管怎样最后它将会被当成垃圾收集掉。术语</span>
								<span lang="EN-US">WorkingMemory Actions </span>
								<span style="FONT-FAMILY: 宋体">代表了对</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">的</span>
								<span lang="EN-US">assertions</span>
								<span style="FONT-FAMILY: 宋体">，</span>
								<span lang="EN-US">retractions</span>
								<span style="FONT-FAMILY: 宋体">和</span>
								<span lang="EN-US">modifications</span>
								<span style="FONT-FAMILY: 宋体">。</span>
						</p>
						<p class="MsoNormal">
								<b>
										<span lang="EN-US">4.1 Facts<o:p></o:p></span>
								</b>
						</p>
						<p class="MsoNormal">
								<span lang="EN-US">Facts</span>
								<span style="FONT-FAMILY: 宋体">是从你的应用中，被</span>
								<span lang="EN-US">assert</span>
								<span style="FONT-FAMILY: 宋体">进</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">中的对象（</span>
								<span lang="EN-US">beans</span>
								<span style="FONT-FAMILY: 宋体">）。</span>
								<span lang="EN-US">Facts</span>
								<span style="FONT-FAMILY: 宋体">是规则可以访问的任意的</span>
								<span lang="EN-US">java</span>
								<span style="FONT-FAMILY: 宋体">对象。规则引擎中的</span>
								<span lang="EN-US">facts</span>
								<span style="FONT-FAMILY: 宋体">并不是“</span>
								<span lang="EN-US">clone</span>
								<span style="FONT-FAMILY: 宋体">”</span>
								<span lang="EN-US">facts</span>
								<span style="FONT-FAMILY: 宋体">，它只是持有到你的应用中数据的引用。</span>
								<span lang="EN-US">Facts</span>
								<span style="FONT-FAMILY: 宋体">是你的应用数据。</span>
								<span lang="EN-US">String</span>
								<span style="FONT-FAMILY: 宋体">和其他没有</span>
								<span lang="EN-US">getter</span>
								<span style="FONT-FAMILY: 宋体">和</span>
								<span lang="EN-US">setter</span>
								<span style="FONT-FAMILY: 宋体">的类不是有效的</span>
								<span lang="EN-US">Fact</span>
								<span style="FONT-FAMILY: 宋体">。这样的类不能使用域约束（</span>
								<span lang="EN-US">Field Constraints</span>
								<span style="FONT-FAMILY: 宋体">），因为使用域约束要依靠</span>
								<span lang="EN-US">JavaBean</span>
								<span style="FONT-FAMILY: 宋体">标准的</span>
								<span lang="EN-US">getter</span>
								<span style="FONT-FAMILY: 宋体">和</span>
								<span lang="EN-US">setter</span>
								<span style="FONT-FAMILY: 宋体">来同对象交互。</span>
						</p>
						<p class="MsoNormal">
								<b>
										<span lang="EN-US">4.2 Assertion<o:p></o:p></span>
								</b>
						</p>
						<p class="MsoNormal">
								<span lang="EN-US">“Assertion”</span>
								<span style="FONT-FAMILY: 宋体">是将</span>
								<span lang="EN-US">facts</span>
								<span style="FONT-FAMILY: 宋体">告诉</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">的动作，例如</span>
								<span lang="EN-US">WorkingMemory.assertObject (yourObject) </span>
								<span style="FONT-FAMILY: 宋体">。当你</span>
								<span lang="EN-US">assert</span>
								<span style="FONT-FAMILY: 宋体">一个</span>
								<span lang="EN-US">fact</span>
								<span style="FONT-FAMILY: 宋体">，它将被检查是否匹配规则。这意味着所有的匹配工作将会在</span>
								<span lang="EN-US">assert</span>
								<span style="FONT-FAMILY: 宋体">的过程中完成。尽管如此，当你完成</span>
								<span lang="EN-US">assert facts</span>
								<span style="FONT-FAMILY: 宋体">之后，你还要调用“</span>
								<span lang="EN-US">fireAllRules()</span>
								<span style="FONT-FAMILY: 宋体">”方法来执行规则。</span>
						</p>
						<p class="MsoNormal">
								<span style="FONT-FAMILY: 宋体">当一个对象被</span>
								<span lang="EN-US">assert</span>
								<span style="FONT-FAMILY: 宋体">后，会返回一个</span>
								<span lang="EN-US">FactHandle</span>
								<span style="FONT-FAMILY: 宋体">。这个</span>
								<span lang="EN-US">FactHandle</span>
								<span style="FONT-FAMILY: 宋体">是一个代表在</span>
								<span lang="EN-US">Working Memory</span>
								<span style="FONT-FAMILY: 宋体">中你的</span>
								<span lang="EN-US">asserted Object</span>
								<span style="FONT-FAMILY: 宋体">的令牌（</span>
								<span lang="EN-US">token</span>
								<span style="FONT-FAMILY: 宋体">）。当你希望</span>
								<span lang="EN-US">retract</span>
								<span style="FONT-FAMILY: 宋体">或者</span>
								<span lang="EN-US">modify</span>
								<span style="FONT-FAMILY: 宋体">一个对象的时候，这个令牌让你用来同</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">进行交互。</span>
						</p>
						<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
								<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
								<span style="COLOR: rgb(0,0,0)">Cheese stilton </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> </span>
								<span style="COLOR: rgb(0,0,255)">new</span>
								<span style="COLOR: rgb(0,0,0)"> Cheese(</span>
								<span style="COLOR: rgb(0,0,0)">"</span>
								<span style="COLOR: rgb(0,0,0)">stilton</span>
								<span style="COLOR: rgb(0,0,0)">"</span>
								<span style="COLOR: rgb(0,0,0)">);<br />FactHandle stiltonHandle </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> workingMemory.assertObject( stilton );<br /></span>
						</div>
						<br />
						<p class="MsoNormal">
								<span lang="EN-US">WorkingMeomry</span>
								<span style="FONT-FAMILY: 宋体">有两种</span>
								<span lang="EN-US">assertion</span>
								<span style="FONT-FAMILY: 宋体">模式：</span>
								<span lang="EN-US">Equality</span>
								<span style="FONT-FAMILY: 宋体">和</span>
								<span lang="EN-US">Identity</span>
								<span style="FONT-FAMILY: 宋体">（默认是</span>
								<span lang="EN-US">Identity</span>
								<span style="FONT-FAMILY: 宋体">）。</span>
						</p>
						<p class="MsoNormal">
								<span lang="EN-US">Identity</span>
								<span style="FONT-FAMILY: 宋体">模式下</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">使用一个</span>
								<span lang="EN-US">IdentityHashMap</span>
								<span style="FONT-FAMILY: 宋体">来存储所有的</span>
								<span lang="EN-US">asserted Objects</span>
								<span style="FONT-FAMILY: 宋体">。这个模式下，当</span>
								<span lang="EN-US">asserted</span>
								<span style="FONT-FAMILY: 宋体">的</span>
								<span lang="EN-US">Object</span>
								<span style="FONT-FAMILY: 宋体">是同一个实例时，它返回同一个</span>
								<span lang="EN-US">FactHandle</span>
								<span style="FONT-FAMILY: 宋体">。</span>
						</p>
						<p class="MsoNormal">
								<span lang="EN-US">Equality</span>
								<span style="FONT-FAMILY: 宋体">模式下</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">使用一个</span>
								<span lang="EN-US">HashMap</span>
								<span style="FONT-FAMILY: 宋体">来存储所有的</span>
								<span lang="EN-US">asserted Objects</span>
								<span style="FONT-FAMILY: 宋体">。这个模式下，当</span>
								<span lang="EN-US">asserted</span>
								<span style="FONT-FAMILY: 宋体">的</span>
								<span lang="EN-US">Object</span>
								<span style="FONT-FAMILY: 宋体">相等时，它返回同一个</span>
								<span lang="EN-US">FactHandle</span>
								<span style="FONT-FAMILY: 宋体">。</span>
						</p>
						<p class="MsoNormal">
								<span style="FONT-FAMILY: 宋体">（</span>
								<span lang="EN-US">WorkingMemory.assertObject(yourObjcet)</span>
								<span style="FONT-FAMILY: 宋体">只是进行</span>
								<span lang="EN-US">assertion</span>
								<span style="FONT-FAMILY: 宋体">的一种</span>
								<span lang="EN-US">regular</span>
								<span style="FONT-FAMILY: 宋体">方法，还存在有一种称为</span>
								<span lang="EN-US">logical assertion</span>
								<span style="FONT-FAMILY: 宋体">的动作）。</span>
						</p>
						<p class="MsoNormal">
								<b>
										<span lang="EN-US">4.3 Retraction<o:p></o:p></span>
								</b>
						</p>
						<p class="MsoNormal">
								<span style="FONT-FAMILY: 宋体">基本上就是</span>
								<span lang="EN-US">assert</span>
								<span style="FONT-FAMILY: 宋体">的逆操作。当你</span>
								<span lang="EN-US">retract</span>
								<span style="FONT-FAMILY: 宋体">一个</span>
								<span lang="EN-US">fact</span>
								<span style="FONT-FAMILY: 宋体">，</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">将不再跟踪那个</span>
								<span lang="EN-US">fact</span>
								<span style="FONT-FAMILY: 宋体">。任何被</span>
								<span lang="EN-US">activated</span>
								<span style="FONT-FAMILY: 宋体">并依赖那个</span>
								<span lang="EN-US">fact</span>
								<span style="FONT-FAMILY: 宋体">的规则将被取消。注意：完全有可能存在某条规则是依赖于一个</span>
								<span lang="EN-US">fact</span>
								<span style="FONT-FAMILY: 宋体">的“不存在”（</span>
								<span lang="EN-US">non existence</span>
								<span style="FONT-FAMILY: 宋体">）。在这种情况下，</span>
								<span lang="EN-US">retract</span>
								<span style="FONT-FAMILY: 宋体">一个</span>
								<span lang="EN-US">fact</span>
								<span style="FONT-FAMILY: 宋体">将导致一条规则被激活。对一个</span>
								<span lang="EN-US">Fact</span>
								<span style="FONT-FAMILY: 宋体">进行</span>
								<span lang="EN-US">Retraction</span>
								<span style="FONT-FAMILY: 宋体">，必须用</span>
								<span lang="EN-US">assert</span>
								<span style="FONT-FAMILY: 宋体">时返回的那个</span>
								<span lang="EN-US">FactHandle</span>
								<span style="FONT-FAMILY: 宋体">做为参数。</span>
						</p>
						<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
								<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
								<span style="COLOR: rgb(0,0,0)">Cheese stilton </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> </span>
								<span style="COLOR: rgb(0,0,255)">new</span>
								<span style="COLOR: rgb(0,0,0)"> Cheese(</span>
								<span style="COLOR: rgb(0,0,0)">"</span>
								<span style="COLOR: rgb(0,0,0)">stilton</span>
								<span style="COLOR: rgb(0,0,0)">"</span>
								<span style="COLOR: rgb(0,0,0)">);<br />FactHandle stiltonHandle </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> workingMemory.assertObject( stilton );<br /><img src="http://www.blogjava.net/images/dot.gif" />.<br />workingMemory.retractObject( stiltonHandle );<br /></span>
						</div>
						<b>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">
								</span>
						</b>
						<br />
						<p class="MsoNormal">
								<b>
										<span lang="EN-US">4.4 Modification<o:p></o:p></span>
								</b>
						</p>
						<p class="MsoNormal">
								<span style="FONT-FAMILY: 宋体">当一个</span>
								<span lang="EN-US">Fact</span>
								<span style="FONT-FAMILY: 宋体">被修改了，会通知规则引擎进行重新处理。在规则引擎内部实际上是对旧的</span>
								<span lang="EN-US">Fact</span>
								<span style="FONT-FAMILY: 宋体">进行</span>
								<span lang="EN-US">retract</span>
								<span style="FONT-FAMILY: 宋体">，然后对新的</span>
								<span lang="EN-US">Object</span>
								<span style="FONT-FAMILY: 宋体">再进行</span>
								<span lang="EN-US">assert</span>
								<span style="FONT-FAMILY: 宋体">。要使用</span>
								<span lang="EN-US">modifyObject()</span>
								<span style="FONT-FAMILY: 宋体">方法来通知</span>
								<span lang="EN-US">Working Memory</span>
								<span style="FONT-FAMILY: 宋体">，被改变的</span>
								<span lang="EN-US">Object</span>
								<span style="FONT-FAMILY: 宋体">并不会自己通知规则引擎。注意：</span>
								<span lang="EN-US">modifyObject()</span>
								<span style="FONT-FAMILY: 宋体">方法总是要把被修改的</span>
								<span lang="EN-US">Object</span>
								<span style="FONT-FAMILY: 宋体">做为第二参数，这就允许你把一个不可变对象替换为另一个新对象。</span>
						</p>
						<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
								<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
								<span style="COLOR: rgb(0,0,0)">Cheese stilton </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> </span>
								<span style="COLOR: rgb(0,0,255)">new</span>
								<span style="COLOR: rgb(0,0,0)"> Cheese(</span>
								<span style="COLOR: rgb(0,0,0)">"</span>
								<span style="COLOR: rgb(0,0,0)">stilton</span>
								<span style="COLOR: rgb(0,0,0)">"</span>
								<span style="COLOR: rgb(0,0,0)">);<br />FactHandle stiltonHandle </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> workingMemory.assertObject( stilton );<br /><img src="http://www.blogjava.net/images/dot.gif" />.<br />stilton.setPrice( </span>
								<span style="COLOR: rgb(0,0,0)">100</span>
								<span style="COLOR: rgb(0,0,0)"> );<br />workingMemory.modifyObject( stiltonHandle, stilton );<br /></span>
						</div>
						<br />
						<p class="MsoNormal">
								<b>
										<span lang="EN-US">4.5 Globals<o:p></o:p></span>
								</b>
						</p>
						<p class="MsoNormal">
								<span lang="EN-US">Global</span>
								<span style="FONT-FAMILY: 宋体">是一个能够被传进</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">但不需要</span>
								<span lang="EN-US">assert</span>
								<span style="FONT-FAMILY: 宋体">的命名对象。大多数这些对象被用来作为静态信息或服务。这些服务被用在一条规则的</span>
								<span lang="EN-US">RHS</span>
								<span style="FONT-FAMILY: 宋体">，或者可能是从规则引擎返回对象的一种方法。</span>
						</p>
						<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
								<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
								<span style="COLOR: rgb(0,0,0)">List list </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> </span>
								<span style="COLOR: rgb(0,0,255)">new</span>
								<span style="COLOR: rgb(0,0,0)"> ArrayList（）;<br />workingMemory.setGlobal(</span>
								<span style="COLOR: rgb(0,0,0)">"</span>
								<span style="COLOR: rgb(0,0,0)">list</span>
								<span style="COLOR: rgb(0,0,0)">"</span>
								<span style="COLOR: rgb(0,0,0)">, list);<br /></span>
						</div>
						<br />
						<p class="MsoNormal">
								<span lang="EN-US">setGlobal()</span>
								<span style="FONT-FAMILY: 宋体">方法传进去的命名对象必须同</span>
								<span lang="EN-US">RuleBase</span>
								<span style="FONT-FAMILY: 宋体">中所定义的具有相同的类型（就是要同你的规则文件中用</span>
								<span lang="EN-US">Global</span>
								<span style="FONT-FAMILY: 宋体">关键字所定义的类型相同），否则会抛出一个</span>
								<span lang="EN-US">RuntimeException</span>
								<span style="FONT-FAMILY: 宋体">。如果一条规则在你</span>
								<span lang="EN-US">setGlobal</span>
								<span style="FONT-FAMILY: 宋体">之前调用了定义的</span>
								<span lang="EN-US">Global</span>
								<span style="FONT-FAMILY: 宋体">，会抛出一个</span>
								<span lang="EN-US">NullPointerException</span>
								<span style="FONT-FAMILY: 宋体">。</span>
						</p>
						<p class="MsoNormal">
								<b>
										<span lang="EN-US">4.6 Property Change Listener</span>
								</b>
						</p>
						<p class="MsoNormal">
								<span style="FONT-FAMILY: 宋体">如果你的</span>
								<span lang="EN-US">fact</span>
								<span style="FONT-FAMILY: 宋体">对象是</span>
								<span lang="EN-US">JavaBean</span>
								<span style="FONT-FAMILY: 宋体">，你可以为它们实现一个</span>
								<span lang="EN-US">property change listener</span>
								<span style="FONT-FAMILY: 宋体">，然后把它告诉规则引擎。这意味着，当一个</span>
								<span lang="EN-US">fact</span>
								<span style="FONT-FAMILY: 宋体">改变时，规则引擎将会自动知道，并进行响应的动作（你不需要调用</span>
								<span lang="EN-US">modifyObject()</span>
								<span style="FONT-FAMILY: 宋体">方法来通知</span>
								<span lang="EN-US">WorkingMemory</span>
								<span style="FONT-FAMILY: 宋体">）。</span>
								<span lang="EN-US">Proxy libraries</span>
								<span style="FONT-FAMILY: 宋体">将会帮助实现这一切。要让</span>
								<span lang="EN-US">Property Change Listener</span>
								<span style="FONT-FAMILY: 宋体">生效，还要将</span>
								<span lang="EN-US">fact</span>
								<span style="FONT-FAMILY: 宋体">设置为动态（</span>
								<span lang="EN-US">dynamic</span>
								<span style="FONT-FAMILY: 宋体">）模式，通过将</span>
								<span lang="EN-US">true</span>
								<span style="FONT-FAMILY: 宋体">做为</span>
								<span lang="EN-US">assertObject()</span>
								<span style="FONT-FAMILY: 宋体">方法的第二个参数来实现：</span>
						</p>
						<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
								<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
								<span style="COLOR: rgb(0,0,0)">Cheese stilton </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> </span>
								<span style="COLOR: rgb(0,0,255)">new</span>
								<span style="COLOR: rgb(0,0,0)"> Cheese(</span>
								<span style="COLOR: rgb(0,0,0)">"</span>
								<span style="COLOR: rgb(0,0,0)">stilton</span>
								<span style="COLOR: rgb(0,0,0)">"</span>
								<span style="COLOR: rgb(0,0,0)">);<br />FactHandle stiltonHandle </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> workingMemory.assertObject( stilton, </span>
								<span style="COLOR: rgb(0,0,255)">true</span>
								<span style="COLOR: rgb(0,0,0)"> );  </span>
								<span style="COLOR: rgb(0,128,0)">//</span>
								<span style="COLOR: rgb(0,128,0)">specifies </span>
								<span style="COLOR: rgb(0,128,0)">t</span>
								<span style="COLOR: rgb(0,128,0)">hat this is a dynamic fact<br /></span>
						</div>
						<br />
						<p class="MsoNormal">
								<span style="FONT-FAMILY: 宋体">然后要在</span>
								<span lang="EN-US">JavaBean</span>
								<span style="FONT-FAMILY: 宋体">中加入一个</span>
								<span lang="EN-US">PropertyChangeSupport </span>
								<span style="FONT-FAMILY: 宋体">实例，和两个方法：</span>
								<span lang="EN-US">addPropertyChangeListener()</span>
								<span style="FONT-FAMILY: 宋体">和</span>
								<span lang="EN-US">removePropertyChangeListener()</span>
								<span style="FONT-FAMILY: 宋体">。最后要在</span>
								<span lang="EN-US">JavaBean</span>
								<span style="FONT-FAMILY: 宋体">的</span>
								<span lang="EN-US">setter</span>
								<span style="FONT-FAMILY: 宋体">方法中通知</span>
								<span lang="EN-US">PropertyChangeSupport</span>
								<span style="FONT-FAMILY: 宋体">所发生的变化。示例代码如下：</span>
						</p>
						<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
								<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
								<span style="COLOR: rgb(0,0,255)">private</span>
								<span style="COLOR: rgb(0,0,0)"> </span>
								<span style="COLOR: rgb(0,0,255)">final</span>
								<span style="COLOR: rgb(0,0,0)"> PropertyChangeSupport changes </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> </span>
								<span style="COLOR: rgb(0,0,255)">new</span>
								<span style="COLOR: rgb(0,0,0)"> PropertyChangeSupport( </span>
								<span style="COLOR: rgb(0,0,255)">this</span>
								<span style="COLOR: rgb(0,0,0)"> );<br /><img src="http://www.blogjava.net/images/dot.gif" /><br /></span>
								<span style="COLOR: rgb(0,0,255)">public</span>
								<span style="COLOR: rgb(0,0,0)"> </span>
								<span style="COLOR: rgb(0,0,255)">void</span>
								<span style="COLOR: rgb(0,0,0)"> addPropertyChangeListener(</span>
								<span style="COLOR: rgb(0,0,255)">final</span>
								<span style="COLOR: rgb(0,0,0)"> PropertyChangeListener l) {<br />    </span>
								<span style="COLOR: rgb(0,0,255)">this</span>
								<span style="COLOR: rgb(0,0,0)">.changes.addPropertyChangeListener( l );<br />}<br /><br /></span>
								<span style="COLOR: rgb(0,0,255)">public</span>
								<span style="COLOR: rgb(0,0,0)"> </span>
								<span style="COLOR: rgb(0,0,255)">void</span>
								<span style="COLOR: rgb(0,0,0)"> removePropertyChangeListener(</span>
								<span style="COLOR: rgb(0,0,255)">final</span>
								<span style="COLOR: rgb(0,0,0)"> PropertyChangeListener l) {<br />    </span>
								<span style="COLOR: rgb(0,0,255)">this</span>
								<span style="COLOR: rgb(0,0,0)">.changes.removePropertyChangeListener( l );<br />}<br /><img src="http://www.blogjava.net/images/dot.gif" /><br /></span>
								<span style="COLOR: rgb(0,0,255)">public</span>
								<span style="COLOR: rgb(0,0,0)"> </span>
								<span style="COLOR: rgb(0,0,255)">void</span>
								<span style="COLOR: rgb(0,0,0)"> setState(</span>
								<span style="COLOR: rgb(0,0,255)">final</span>
								<span style="COLOR: rgb(0,0,0)"> String newState) {<br />    String oldState </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> </span>
								<span style="COLOR: rgb(0,0,255)">this</span>
								<span style="COLOR: rgb(0,0,0)">.state;<br />    </span>
								<span style="COLOR: rgb(0,0,255)">this</span>
								<span style="COLOR: rgb(0,0,0)">.state </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> newState;<br /></span>
								<span style="COLOR: rgb(0,0,255)">this</span>
								<span style="COLOR: rgb(0,0,0)">.changes.firePropertyChange( </span>
								<span style="COLOR: rgb(0,0,0)">"</span>
								<span style="COLOR: rgb(0,0,0)">state</span>
								<span style="COLOR: rgb(0,0,0)">"</span>
								<span style="COLOR: rgb(0,0,0)">, oldState, newState );<br /><br /></span>
						</div>
						<br />
						<b>
								<span lang="EN-US" style="FONT-SIZE: 14pt; FONT-FAMILY: 'Times New Roman'">5. Agenda:</span>
						</b>
						<br />
						<br />
						<div align="center">
								<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_Agenda.png" />
								<br />
								<b>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Figure 5.1 . Agenda</span>
								</b>
								<br />
								<div align="left">
										<p class="MsoNormal">
												<span lang="EN-US">Agenda</span>
												<span style="FONT-FAMILY: 宋体">是</span>
												<span lang="EN-US">RETE</span>
												<span style="FONT-FAMILY: 宋体">的一个特点。在一个</span>
												<span lang="EN-US">WorkingMemory Action</span>
												<span style="FONT-FAMILY: 宋体">发生时，可能会有多条规则发生完全匹配。当一条规则完全匹配的时候，一个</span>
												<span lang="EN-US">Activation</span>
												<span style="FONT-FAMILY: 宋体">就被创建（引用了这条规则和与其匹配的</span>
												<span lang="EN-US">facts</span>
												<span style="FONT-FAMILY: 宋体">），然后放进</span>
												<span lang="EN-US">Agenda</span>
												<span style="FONT-FAMILY: 宋体">中。</span>
												<span lang="EN-US">Agenda</span>
												<span style="FONT-FAMILY: 宋体">通过使用冲突解决策略（</span>
												<span lang="EN-US">Conflict Resolution Strategy</span>
												<span style="FONT-FAMILY: 宋体">）来安排这些</span>
												<span lang="EN-US">Activations</span>
												<span style="FONT-FAMILY: 宋体">的执行。</span>
										</p>
										<p class="MsoNormal">
												<span style="FONT-FAMILY: 宋体">引擎工作在一个“</span>
												<span lang="EN-US">2</span>
												<span style="FONT-FAMILY: 宋体">阶段”模式下：</span>
										</p>
										<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US">1）<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">  </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">WorkingMemory Actions </span><span style="FONT-FAMILY: 宋体">：</span><span lang="EN-US">assert</span><span style="FONT-FAMILY: 宋体">新的</span><span lang="EN-US">facts</span><span style="FONT-FAMILY: 宋体">，修改存在的</span><span lang="EN-US">facts</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">retract facts</span><span style="FONT-FAMILY: 宋体">都是</span><span lang="EN-US">WorkingMemory Actions</span><span style="FONT-FAMILY: 宋体">。通过在应用程序中调用</span><span lang="EN-US">fireAllRules()</span><span style="FONT-FAMILY: 宋体">方法，会使引擎转换到</span><span lang="EN-US">Agenda Evaluatioin</span><span style="FONT-FAMILY: 宋体">阶段。</span></p>
										<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US">2）<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">  </span></span>&lt;!--[endif]--&gt; <span lang="EN-US">Agenda Evaluation </span><span style="FONT-FAMILY: 宋体">：尝试选择一条规则进行激发（</span><span lang="EN-US">fire</span><span style="FONT-FAMILY: 宋体">）。如果规则没有找到就退出，否则它就尝试激发这条规则，然后转换到</span><span lang="EN-US">WorkingMemory Actions</span><span style="FONT-FAMILY: 宋体">阶段，直到</span><span lang="EN-US">Agenda</span><span style="FONT-FAMILY: 宋体">中为空。</span></p>
										<p class="MsoNormal">
												<span style="FONT-FAMILY: 宋体">这个过程一直重复，直到</span>
												<span lang="EN-US">Agenda</span>
												<span style="FONT-FAMILY: 宋体">是空的，此时控制权就回到应用程序中。。当</span>
												<span lang="EN-US">WorkingMemory Actions</span>
												<span style="FONT-FAMILY: 宋体">发生时，没有规则正在被激发。</span>
										</p>
										<p class="MsoNormal">
												<span style="FONT-FAMILY: 宋体">下图说明了这个循环的过程：</span>
										</p>
										<div align="center">
												<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_Two_Phase.png" />
												<br />
												<p class="MsoCaption">
														<b>
																<span lang="EN-US">Figure  5.2 . Two Phase Execution</span>
														</b>
												</p>
										</div>
								</div>
								<div align="left">
										<p class="MsoCaption" style="TEXT-ALIGN: justify">
												<b>
														<span lang="EN-US">5</span>
														<span style="FONT-FAMILY: 宋体">．</span>
														<span lang="EN-US">1 Conflict Resultion</span>
												</b>
												<span lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
										<p class="MsoNormal">
												<span style="FONT-FAMILY: 宋体">当有多条</span>
												<span lang="EN-US">rules</span>
												<span style="FONT-FAMILY: 宋体">在</span>
												<span lang="EN-US">agenda</span>
												<span style="FONT-FAMILY: 宋体">中，就需要解决冲突。当激发一条规则时，会对</span>
												<span lang="EN-US">WorkingMemory</span>
												<span style="FONT-FAMILY: 宋体">产生副作用。规则引擎需要知道规则要以什么顺序来激发（例如，激发</span>
												<span lang="EN-US">rule A</span>
												<span style="FONT-FAMILY: 宋体">可能会引起</span>
												<span lang="EN-US">rule B</span>
												<span style="FONT-FAMILY: 宋体">被从</span>
												<span lang="EN-US">agenda</span>
												<span style="FONT-FAMILY: 宋体">中移除。）</span>
										</p>
										<p class="MsoNormal">
												<span lang="EN-US">Drools</span>
												<span style="FONT-FAMILY: 宋体">采取的冲突解决策略有</span>
												<span lang="EN-US">2</span>
												<span style="FONT-FAMILY: 宋体">种，按照优先级排列如下：</span>
												<span lang="EN-US">Salience</span>
												<span style="FONT-FAMILY: 宋体">，</span>
												<span lang="EN-US">LIFO</span>
												<span style="FONT-FAMILY: 宋体">（后进先出）。最易懂的策略是“</span>
												<span lang="EN-US">Salience</span>
												<span style="FONT-FAMILY: 宋体">”，即优先级，</span>
												<span lang="EN-US">user</span>
												<span style="FONT-FAMILY: 宋体">可以为某个</span>
												<span lang="EN-US">rule</span>
												<span style="FONT-FAMILY: 宋体">指定一个高一点的优先级（通过附给它一个比较大的数字）。高</span>
												<span lang="EN-US">Salience</span>
												<span style="FONT-FAMILY: 宋体">的</span>
												<span lang="EN-US">rule</span>
												<span style="FONT-FAMILY: 宋体">将会被优先激发。</span>
										</p>
										<p class="MsoNormal">
												<b>
														<span lang="EN-US">5</span>
												</b>
												<b>
														<span style="FONT-FAMILY: 宋体">．</span>
														<span lang="EN-US">2 Agenda Groups</span>
												</b>
												<b>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</b>
										</p>
										<p class="MsoNormal">
												<span lang="EN-US">Agenda Groups</span>
												<span style="FONT-FAMILY: 宋体">是划分</span>
												<span lang="EN-US">Agenda</span>
												<span style="FONT-FAMILY: 宋体">中</span>
												<span lang="EN-US">rules</span>
												<span style="FONT-FAMILY: 宋体">（其实是“</span>
												<span lang="EN-US">activations</span>
												<span style="FONT-FAMILY: 宋体">”）的一种方法。在任意一个时刻，只有一个</span>
												<span lang="EN-US">group</span>
												<span style="FONT-FAMILY: 宋体">拥有“</span>
												<span lang="EN-US">focus</span>
												<span style="FONT-FAMILY: 宋体">”，这意味着只有在那个</span>
												<span lang="EN-US">group</span>
												<span style="FONT-FAMILY: 宋体">中的</span>
												<span lang="EN-US">activations</span>
												<span style="FONT-FAMILY: 宋体">才是有效的。</span>
										</p>
										<p class="MsoNormal">
												<span lang="EN-US">Agenda Groups </span>
												<span style="FONT-FAMILY: 宋体">是在</span>
												<span lang="EN-US">grouped rules</span>
												<span style="FONT-FAMILY: 宋体">之间创建一个“流”（</span>
												<span lang="EN-US">flow</span>
												<span style="FONT-FAMILY: 宋体">）的简便的方法。你可以在规则引擎中，或是用</span>
												<span lang="EN-US">API</span>
												<span style="FONT-FAMILY: 宋体">来切换具有焦点的组。如果你的规则有很明确的多“阶段”（</span>
												<span lang="EN-US">phases</span>
												<span style="FONT-FAMILY: 宋体">）或多“序列”（</span>
												<span lang="EN-US">sequences</span>
												<span style="FONT-FAMILY: 宋体">）的处理，可以考虑用</span>
												<span lang="EN-US">Agenda Groups</span>
												<span style="FONT-FAMILY: 宋体">来达到这个目的。</span>
										</p>
										<p class="MsoNormal">
												<span style="FONT-FAMILY: 宋体">每次调用</span>
												<span lang="EN-US">setFocus()</span>
												<span style="FONT-FAMILY: 宋体">方法的时候，那个</span>
												<span lang="EN-US">Agenda Group</span>
												<span style="FONT-FAMILY: 宋体">就会被压入一个堆栈，当这个有焦点的组为空时，它就会被弹出，然后下一个组就会被执行。一个</span>
												<span lang="EN-US">Agenda Group</span>
												<span style="FONT-FAMILY: 宋体">可以出现在堆栈的多个位置。默认的</span>
												<span lang="EN-US">Agenda Group</span>
												<span style="FONT-FAMILY: 宋体">是“</span>
												<span lang="EN-US">MAIN</span>
												<span style="FONT-FAMILY: 宋体">”，所有没有被指定</span>
												<span lang="EN-US">Agenda Group</span>
												<span style="FONT-FAMILY: 宋体">的</span>
												<span lang="EN-US">Activations</span>
												<span style="FONT-FAMILY: 宋体">都被放到那个组中，这个组总是被放在堆栈的第一个组，并默认给予焦点。</span>
										</p>
										<p class="MsoNormal">
												<b>
														<span lang="EN-US">5</span>
												</b>
												<b>
														<span style="FONT-FAMILY: 宋体">．</span>
														<span lang="EN-US">3<span>  </span>Agenda Filters<o:p></o:p></span>
												</b>
										</p>
										<div align="center">
												<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_AgendaFilter.png" />
												<br />
												<b>
														<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Figure 5.3. Agenda Filter</span>
												</b>
												<br />
												<div align="left">
														<p class="MsoNormal">
																<span lang="EN-US">Filter</span>
																<span style="FONT-FAMILY: 宋体">必须实现</span>
																<span lang="EN-US">AgendaFilter</span>
																<span style="FONT-FAMILY: 宋体">接口，用来允许或禁止一个</span>
																<span lang="EN-US">activation</span>
																<span style="FONT-FAMILY: 宋体">能够被激发。</span>
																<span lang="EN-US">Drools</span>
																<span style="FONT-FAMILY: 宋体">提供了下面几种方便的默认实现：</span>
														</p>
														<p style="MARGIN-LEFT: 36pt; TEXT-INDENT: -18pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Symbol">·<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US" style="FONT-FAMILY: 'Times New Roman'">RuleNameEndWithAgendaFilter<o:p></o:p></span></p>
														<p style="MARGIN-LEFT: 36pt; TEXT-INDENT: -18pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Symbol">·<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US" style="FONT-FAMILY: 'Times New Roman'">RuleNameEqualsAgendaFilter<o:p></o:p></span></p>
														<p style="MARGIN-LEFT: 36pt; TEXT-INDENT: -18pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Symbol">·<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">         </span></span>&lt;!--[endif]--&gt; <span lang="EN-US" style="FONT-FAMILY: 'Times New Roman'">RuleNameStartsWithAgendaFilter<o:p></o:p></span></p>
														<p class="MsoNormal">
																<span style="FONT-FAMILY: 宋体">要使用一个</span>
																<span lang="EN-US">filter</span>
																<span style="FONT-FAMILY: 宋体">就要在调用</span>
																<span lang="EN-US">fireAllRules()</span>
																<span style="FONT-FAMILY: 宋体">方法的时候指定它。下面的例子将对所有名字以“</span>
																<span lang="EN-US">Test</span>
																<span style="FONT-FAMILY: 宋体">”结尾的规则进行过滤：</span>
														</p>
														<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
																<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
																<span style="COLOR: rgb(0,0,0)">workingMemory.fireAllRules( </span>
																<span style="COLOR: rgb(0,0,255)">new</span>
																<span style="COLOR: rgb(0,0,0)"> RuleNameEndsWithAgendaFilter( </span>
																<span style="COLOR: rgb(0,0,0)">"</span>
																<span style="COLOR: rgb(0,0,0)">Test</span>
																<span style="COLOR: rgb(0,0,0)">"</span>
																<span style="COLOR: rgb(0,0,0)"> ) );</span>
														</div>
												</div>
												<div align="left">
														<br />
														<p class="MsoNormal">
																<b>
																		<span lang="EN-US" style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体">6．事件模型（</span>
																</b>
																<b>
																		<span lang="EN-US" style="FONT-SIZE: 14pt">Event Model</span>
																</b>
																<span style="FONT-FAMILY: 宋体">）</span>
														</p>
														<p class="MsoNormal">
																<span lang="EN-US">Event</span>
																<span style="FONT-FAMILY: 宋体">包里提供了规则引擎的事件机制，包括规则激发，对象被</span>
																<span lang="EN-US">asserted</span>
																<span style="FONT-FAMILY: 宋体">等等。你可以使用事件机制来进行</span>
																<span lang="EN-US">AOP</span>
																<span style="FONT-FAMILY: 宋体">编程。</span>
														</p>
														<p class="MsoNormal">
																<span style="FONT-FAMILY: 宋体">有两种类型的</span>
																<span lang="EN-US">Event Listener</span>
																<span style="FONT-FAMILY: 宋体">：</span>
																<span lang="EN-US">WorkingMemoryEventListener</span>
																<span style="FONT-FAMILY: 宋体">和</span>
																<span lang="EN-US">AgendaEventListener</span>
																<span style="FONT-FAMILY: 宋体">。</span>
														</p>
														<div align="center">
																<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_WorkingMemoryEventListener.png" />
																<br />
																<b>
																		<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Figure 6.1. WorkingMemoryEventListener</span>
																</b>
																<br />
																<br />
																<div align="center">
																		<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_AgendaEventListener.png" />
																		<br />
																		<b>
																				<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Figure 6.2  AgendaEventListener</span>
																		</b>
																		<br />
																</div>
																<div align="left">
																		<br />
																		<p class="MsoNormal">
																				<span style="FONT-FAMILY: 宋体">对两个</span>
																				<span lang="EN-US">EventListener</span>
																				<span style="FONT-FAMILY: 宋体">接口都提供了默认实现，但在方法中并没有做任何事。你可以继承这两个默认实现来完成你自己的实现－</span>
																				<span lang="EN-US">DefaultAgendaEventListener</span>
																				<span style="FONT-FAMILY: 宋体">和</span>
																				<span lang="EN-US">DefaultWorkingMemoryEventListener</span>
																				<span style="FONT-FAMILY: 宋体">。下面代码说明了如何扩展一个</span>
																				<span lang="EN-US">DefaultAgendaEventListner</span>
																				<span style="FONT-FAMILY: 宋体">并把它加到</span>
																				<span lang="EN-US">WorkingMemory</span>
																				<span style="FONT-FAMILY: 宋体">中，例子中只完成了</span>
																				<span lang="EN-US">afterActivationFired()</span>
																				<span style="FONT-FAMILY: 宋体">方法：</span>
																		</p>
																		<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
																				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
																				<span style="COLOR: rgb(0,0,0)">workingMemory.addEventListener( </span>
																				<span style="COLOR: rgb(0,0,255)">new</span>
																				<span style="COLOR: rgb(0,0,0)"> DefaultAgendaEventListener() {                            <br />   </span>
																				<span style="COLOR: rgb(0,0,255)">public</span>
																				<span style="COLOR: rgb(0,0,0)"> </span>
																				<span style="COLOR: rgb(0,0,255)">void</span>
																				<span style="COLOR: rgb(0,0,0)"> afterActivationFired(AfterActivationFiredEvent event) {<br />       </span>
																				<span style="COLOR: rgb(0,0,255)">super</span>
																				<span style="COLOR: rgb(0,0,0)">.afterActivationFired( event );<br />       System.out.println( event );<br />   }<br />   <br />});<br /></span>
																		</div>
																		<p class="MsoNormal">
																				<span lang="EN-US">Drools</span>
																				<span style="FONT-FAMILY: 宋体">也提供了</span>
																				<span lang="EN-US">DebugWorkingMemoryEventListener</span>
																				<span style="FONT-FAMILY: 宋体">和</span>
																				<span lang="EN-US">DebugAgendaEventListener</span>
																				<span style="FONT-FAMILY: 宋体">两个实现类，在这两个类的方法中实现了</span>
																				<span lang="EN-US">debug</span>
																				<span style="FONT-FAMILY: 宋体">信息的输出：</span>
																		</p>
																		<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
																				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
																				<span style="COLOR: rgb(0,0,0)">workingMemory.addEventListener( </span>
																				<span style="COLOR: rgb(0,0,255)">new</span>
																				<span style="COLOR: rgb(0,0,0)"> DebugWorkingMemoryEventListener() );<br /><br /></span>
																		</div>
																		<br />
																</div>
														</div>
												</div>
										</div>
								</div>
						</div>
				</div>
		</div>
<img src ="http://www.blogjava.net/clant/aggbug/85144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clant/" target="_blank">BPM </a> 2006-12-03 09:54 <a href="http://www.blogjava.net/clant/articles/85144.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（二）: RETE算法 </title><link>http://www.blogjava.net/clant/articles/85142.html</link><dc:creator>BPM </dc:creator><author>BPM </author><pubDate>Sun, 03 Dec 2006 01:53:00 GMT</pubDate><guid>http://www.blogjava.net/clant/articles/85142.html</guid><wfw:comment>http://www.blogjava.net/clant/comments/85142.html</wfw:comment><comments>http://www.blogjava.net/clant/articles/85142.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clant/comments/commentRss/85142.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clant/services/trackbacks/85142.html</trackback:ping><description><![CDATA[
		<font face="Georgia">在</font>
		<a href="/guangnian0412/archive/2006/06/01/49695.html">
				<font face="Georgia" color="#009933">JBoss Rules 学习（一）:什么是Rule</font>
		</a>
		<font face="Georgia">中，我们介绍了JBoss Rules中对Rule的表示，其中提到了JBoss Rule中主要采用的RETE算法来进行规则匹配。下面将详细的介绍一下RETE算法在JBoss Rule中的实现，最后随便提一下JBoss Rules中也可以使用的另一种规则匹配算法Leaps。<br /><br /></font>
		<b>
				<span lang="EN-US" style="FONT-SIZE: 14pt; FONT-FAMILY: 'Times New Roman'">1.Rete </span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体">算法</span>
		</b>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">：<br /></span>
		<p class="MsoNormal">
				<span lang="EN-US">Rete</span>
				<span style="FONT-FAMILY: 宋体">在拉丁语中是</span>
				<span lang="EN-US">”net”</span>
				<span style="FONT-FAMILY: 宋体">，有网络的意思。</span>
				<span lang="EN-US">RETE</span>
				<span style="FONT-FAMILY: 宋体">算法可以分为两部分：规则编译（</span>
				<span lang="EN-US">rule compilation</span>
				<span style="FONT-FAMILY: 宋体">）和运行时执行（</span>
				<span lang="EN-US">runtime execution</span>
				<span style="FONT-FAMILY: 宋体">）。</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">编译算法描述了规则如何在</span>
				<span lang="EN-US">Production Memory</span>
				<span style="FONT-FAMILY: 宋体">中产生一个有效的辨别网络。用一个非技术性的词来说，一个辨别网络就是用来过滤数据。方法是通过数据在网络中的传播来过滤数据。在顶端节点将会有很多匹配的数据。当我们顺着网络向下走，匹配的数据将会越来越少。在网络的最底部是终端节点（</span>
				<span lang="EN-US">terminal nodes</span>
				<span style="FONT-FAMILY: 宋体">）。在</span>
				<span lang="EN-US">Dr Forgy</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US">1982</span>
				<span style="FONT-FAMILY: 宋体">年的论文中，他描述了</span>
				<span lang="EN-US">4</span>
				<span style="FONT-FAMILY: 宋体">种基本节点：</span>
				<span lang="EN-US">root , 1-input, 2-input and terminal </span>
				<span style="FONT-FAMILY: 宋体">。下图是</span>
				<span lang="EN-US">Drools</span>
				<span style="FONT-FAMILY: 宋体">中的</span>
				<span lang="EN-US">RETE</span>
				<span style="FONT-FAMILY: 宋体">节点类型：</span>
		</p>
		<div align="center">
				<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_4.PNG" />  <span style="FONT-FAMILY: 宋体"></span><br /><span style="FONT-FAMILY: 宋体"></span></div>
		<p class="MsoNormal" style="TEXT-ALIGN: center" align="center">
				<b>
						<span lang="EN-US">Figure 1. Rete Nodes</span>
				</b>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">根节点（</span>
				<span lang="EN-US">RootNode</span>
				<span style="FONT-FAMILY: 宋体">）是所有的对象进入网络的入口。然后，从根节点立即进入到</span>
				<span lang="EN-US">ObjectTypeNode </span>
				<span style="FONT-FAMILY: 宋体">。</span>
				<span lang="EN-US">ObjectTypeNode</span>
				<span style="FONT-FAMILY: 宋体">的作用是使引擎只做它需要做的事情。例如，我们有两个对象集：</span>
				<span lang="EN-US">Account</span>
				<span style="FONT-FAMILY: 宋体">和</span>
				<span lang="EN-US">Order</span>
				<span style="FONT-FAMILY: 宋体">。如果规则引擎需要对每个对象都进行一个周期的评估，那会浪费很多的时间。为了提高效率，引擎将只让匹配</span>
				<span lang="EN-US">object type </span>
				<span style="FONT-FAMILY: 宋体">的对象通过到达节点。通过这种方法，如果一个应用</span>
				<span lang="EN-US">assert</span>
				<span style="FONT-FAMILY: 宋体">一个新的</span>
				<span lang="EN-US">account</span>
				<span style="FONT-FAMILY: 宋体">，它不会将</span>
				<span lang="EN-US">Order</span>
				<span style="FONT-FAMILY: 宋体">对象传递到节点中。很多现代</span>
				<span lang="EN-US">RETE</span>
				<span style="FONT-FAMILY: 宋体">实现都有专门的</span>
				<span lang="EN-US">ObjectTypeNode</span>
				<span style="FONT-FAMILY: 宋体">。在一些情况下，</span>
				<span lang="EN-US">ObjectTypeNode</span>
				<span style="FONT-FAMILY: 宋体">被用散列法进一步优化。</span>
		</p>
		<p class="MsoNormal" align="center">
				<span style="FONT-FAMILY: 宋体">
						<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_5.PNG" />
				</span>
		</p>
		<p class="MsoNormal" align="center">
				<font size="4">
						<b>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Figure 2 . ObjectTypeNodes</span>
						</b>
				</font>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">ObjectTypeNode</span>
				<span style="FONT-FAMILY: 宋体">能够传播到</span>
				<span lang="EN-US">AlphaNodes, LeftInputAdapterNodes </span>
				<span style="FONT-FAMILY: 宋体">和</span>
				<span lang="EN-US">BetaNodes</span>
				<span style="FONT-FAMILY: 宋体">。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">1-input </span>
				<span style="FONT-FAMILY: 宋体">节点通常被称为</span>
				<span lang="EN-US">AlphaNode </span>
				<span style="FONT-FAMILY: 宋体">。</span>
				<span lang="EN-US">AlphaNodes</span>
				<span style="FONT-FAMILY: 宋体">被用来评估字面条件（</span>
				<span lang="EN-US">literal conditions</span>
				<span style="FONT-FAMILY: 宋体">）。虽然，</span>
				<span lang="EN-US">1982</span>
				<span style="FONT-FAMILY: 宋体">年的论文只提到了相等条件（指的字面上相等），很多</span>
				<span lang="EN-US">RETE</span>
				<span style="FONT-FAMILY: 宋体">实现支持其他的操作。例如，</span>
				<span lang="EN-US">Account.name = = “Mr Trout” </span>
				<span style="FONT-FAMILY: 宋体">是一个字面条件。当一条规则对于一种</span>
				<span lang="EN-US">object type </span>
				<span style="FONT-FAMILY: 宋体">有多条的字面条件，这些字面条件将被链接在一起。这是说，如果一个应用</span>
				<span lang="EN-US">assert</span>
				<span style="FONT-FAMILY: 宋体">一个</span>
				<span lang="EN-US">account</span>
				<span style="FONT-FAMILY: 宋体">对象，在它能到达下一个</span>
				<span lang="EN-US">AlphaNode </span>
				<span style="FONT-FAMILY: 宋体">之前，它必须先满足第一个字面条件。在</span>
				<span lang="EN-US">Dr. Forgy</span>
				<span style="FONT-FAMILY: 宋体">的论文中，他用</span>
				<span lang="EN-US">IntraElement conditions </span>
				<span style="FONT-FAMILY: 宋体">来表述。下面的图说明了</span>
				<span lang="EN-US">Cheese</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US">AlphaNode</span>
				<span style="FONT-FAMILY: 宋体">组合（</span>
				<span lang="EN-US">name = = “cheddar”</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">strength = = “strong”</span>
				<span style="FONT-FAMILY: 宋体">）：</span>
		</p>
		<div align="center">
				<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_6.png" />
				<br />
				<p class="MsoNormal" style="TEXT-ALIGN: center" align="left">
						<b>
								<span lang="EN-US">Figure 3. AlphaNodes</span>
						</b>
				</p>
				<p class="MsoNormal" style="TEXT-ALIGN: center" align="left">
				</p>
				<p class="MsoNormal" align="left">
						<span lang="EN-US">Drools</span>
						<span style="FONT-FAMILY: 宋体">通过散列法优化了从</span>
						<span lang="EN-US">ObjectTypeNode</span>
						<span style="FONT-FAMILY: 宋体">到</span>
						<span lang="EN-US">AlphaNode</span>
						<span style="FONT-FAMILY: 宋体">的传播。每次一个</span>
						<span lang="EN-US">AlphaNode</span>
						<span style="FONT-FAMILY: 宋体">被加到一个</span>
						<span lang="EN-US">ObjectTypeNode</span>
						<span style="FONT-FAMILY: 宋体">的时候，就以字面值（</span>
						<span lang="EN-US">literal value</span>
						<span style="FONT-FAMILY: 宋体">）作为</span>
						<span lang="EN-US">key</span>
						<span style="FONT-FAMILY: 宋体">，以</span>
						<span lang="EN-US">AlphaNode</span>
						<span style="FONT-FAMILY: 宋体">作为</span>
						<span lang="EN-US">value</span>
						<span style="FONT-FAMILY: 宋体">加入</span>
						<span lang="EN-US">HashMap</span>
						<span style="FONT-FAMILY: 宋体">。当一个新的实例进入</span>
						<span lang="EN-US">ObjectTypeNode</span>
						<span style="FONT-FAMILY: 宋体">的时候，不用传递到每一个</span>
						<span lang="EN-US">AlphaNode</span>
						<span style="FONT-FAMILY: 宋体">，它可以直接从</span>
						<span lang="EN-US">HashMap</span>
						<span style="FONT-FAMILY: 宋体">中获得正确的</span>
						<span lang="EN-US">AlphaNode</span>
						<span style="FONT-FAMILY: 宋体">，避免了不必要的字面检查。</span>
				</p>
				<div align="left">
				</div>
				<p class="MsoNormal" align="left">
						<span lang="EN-US">&lt;!--[if !supportEmptyParas]--&gt; <br /></span>
				</p>
				<div align="left">
				</div>
				<p class="MsoNormal" align="left">
						<span lang="EN-US">2-input </span>
						<span style="FONT-FAMILY: 宋体">节点通常被称为</span>
						<span lang="EN-US">BetaNode </span>
						<span style="FONT-FAMILY: 宋体">。</span>
						<span lang="EN-US">Drools</span>
						<span style="FONT-FAMILY: 宋体">中有两种</span>
						<span lang="EN-US">BetaNode</span>
						<span style="FONT-FAMILY: 宋体">：</span>
						<span lang="EN-US">JoinNode</span>
						<span style="FONT-FAMILY: 宋体">和</span>
						<span lang="EN-US">NotNode</span>
						<span style="FONT-FAMILY: 宋体">。</span>
						<span lang="EN-US">BetaNodes </span>
						<span style="FONT-FAMILY: 宋体">被用来对</span>
						<span lang="EN-US">2</span>
						<span style="FONT-FAMILY: 宋体">个对象进行对比。这两个对象可以是同种类型，也可以是不同类型。</span>
				</p>
				<div align="left">
				</div>
				<p class="MsoNormal" align="left">
						<span style="FONT-FAMILY: 宋体">我们约定</span>
						<span lang="EN-US">BetaNodes</span>
						<span style="FONT-FAMILY: 宋体">的</span>
						<span lang="EN-US">2</span>
						<span style="FONT-FAMILY: 宋体">个输入称为左边（</span>
						<span lang="EN-US">left</span>
						<span style="FONT-FAMILY: 宋体">）和右边（</span>
						<span lang="EN-US">right</span>
						<span style="FONT-FAMILY: 宋体">）。一个</span>
						<span lang="EN-US">BetaNode</span>
						<span style="FONT-FAMILY: 宋体">的左边输入通常是</span>
						<span lang="EN-US">a list of objects</span>
						<span style="FONT-FAMILY: 宋体">。在</span>
						<span lang="EN-US">Drools</span>
						<span style="FONT-FAMILY: 宋体">中，这是一个数组。右边输入是</span>
						<span lang="EN-US">a single object</span>
						<span style="FONT-FAMILY: 宋体">。两个</span>
						<span lang="EN-US">NotNode</span>
						<span style="FONT-FAMILY: 宋体">可以完成‘</span>
						<span lang="EN-US">exists</span>
						<span style="FONT-FAMILY: 宋体">’检查。</span>
						<span lang="EN-US">Drools</span>
						<span style="FONT-FAMILY: 宋体">通过将索引应用在</span>
						<span lang="EN-US">BetaNodes</span>
						<span style="FONT-FAMILY: 宋体">上扩展了</span>
						<span lang="EN-US">RETE</span>
						<span style="FONT-FAMILY: 宋体">算法。下图展示了一个</span>
						<span lang="EN-US">JoinNode</span>
						<span style="FONT-FAMILY: 宋体">的使用：</span>
				</p>
				<p class="MsoNormal" align="center">
						<span style="FONT-FAMILY: 宋体">
								<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_7.png" />
						</span>
				</p>
				<p class="MsoNormal" align="center">
						<b>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Figure 4 . JoinNode</span>
						</b>
				</p>
				<p class="MsoNormal" align="left">
						<b>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">
										<br />
								</span>
						</b>
				</p>
				<p class="MsoNormal" align="left">
						<span style="FONT-FAMILY: 宋体">注意到图中的左边输入用到了一个</span>
						<span lang="EN-US">LeftInputAdapterNode</span>
						<span style="FONT-FAMILY: 宋体">，这个节点的作用是将一个</span>
						<span lang="EN-US">single Object</span>
						<span style="FONT-FAMILY: 宋体">转化为一个单对象数组（</span>
						<span lang="EN-US">single Object Tuple</span>
						<span style="FONT-FAMILY: 宋体">），传播到</span>
						<span lang="EN-US">JoinNode</span>
						<span style="FONT-FAMILY: 宋体">节点。因为我们上面提到过左边输入通常是</span>
						<span lang="EN-US">a list of objects</span>
						<span style="FONT-FAMILY: 宋体">。</span>
				</p>
				<div align="left">
				</div>
				<p class="MsoNormal" align="left">
						<span lang="EN-US">&lt;!--[if !supportEmptyParas]--&gt; <?XML:NAMESPACE PREFIX = O /?><o:p></o:p></span>
				</p>
				<div align="left">
				</div>
				<p class="MsoNormal" align="left">
						<span lang="EN-US">Terminal nodes </span>
						<span style="FONT-FAMILY: 宋体">被用来表明一条规则已经匹配了它的所有条件（</span>
						<span lang="EN-US">conditions</span>
						<span style="FONT-FAMILY: 宋体">）。</span>
						<span style="FONT-FAMILY: 宋体">在这点，我们说这条规则有了一个完全匹配（</span>
						<span lang="EN-US">full match</span>
						<span style="FONT-FAMILY: 宋体">）。在一些情况下，一条带有“或”条件的规则可以有超过一个的</span>
						<span lang="EN-US">terminal node</span>
						<span style="FONT-FAMILY: 宋体">。</span>
				</p>
				<div align="left">
				</div>
				<div align="left">
				</div>
				<p class="MsoNormal" align="left">
						<span lang="EN-US">Drools</span>
						<span style="FONT-FAMILY: 宋体">通过节点的共享来提高规则引擎的性能。因为很多的规则可能存在部分相同的模式，节点的共享允许我们对内存中的节点数量进行压缩，以提供遍历节点的过程。下面的两个规则就共享了部分节点：</span>
				</p>
				<p class="MsoNormal" align="left">
						<span style="FONT-FAMILY: 宋体">
						</span>
				</p>
				<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
						<span style="COLOR: rgb(0,0,0)">rule<br />    when<br />        Cheese( $chedddar : name </span>
						<span style="COLOR: rgb(0,0,0)">==</span>
						<span style="COLOR: rgb(0,0,0)"> </span>
						<span style="COLOR: rgb(0,0,0)">"</span>
						<span style="COLOR: rgb(0,0,0)">cheddar</span>
						<span style="COLOR: rgb(0,0,0)">"</span>
						<span style="COLOR: rgb(0,0,0)"> )<br />        $person : Person( favouriteCheese </span>
						<span style="COLOR: rgb(0,0,0)">==</span>
						<span style="COLOR: rgb(0,0,0)"> $cheddar )<br />    then<br />        System.out.println( $person.getName() </span>
						<span style="COLOR: rgb(0,0,0)">+</span>
						<span style="COLOR: rgb(0,0,0)"> </span>
						<span style="COLOR: rgb(0,0,0)">"</span>
						<span style="COLOR: rgb(0,0,0)"> likes cheddar</span>
						<span style="COLOR: rgb(0,0,0)">"</span>
						<span style="COLOR: rgb(0,0,0)"> );<br />end<br /></span>
				</div>
				<p>
				</p>
				<p class="MsoNormal" align="left">
						<br />
						<span style="FONT-FAMILY: 宋体">
						</span>
				</p>
				<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
						<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
						<span style="COLOR: rgb(0,0,0)">rule<br />    when<br />        Cheese( $chedddar : name </span>
						<span style="COLOR: rgb(0,0,0)">==</span>
						<span style="COLOR: rgb(0,0,0)"> </span>
						<span style="COLOR: rgb(0,0,0)">"</span>
						<span style="COLOR: rgb(0,0,0)">cheddar</span>
						<span style="COLOR: rgb(0,0,0)">"</span>
						<span style="COLOR: rgb(0,0,0)"> )<br />        $person : Person( favouriteCheese </span>
						<span style="COLOR: rgb(0,0,0)">!=</span>
						<span style="COLOR: rgb(0,0,0)"> $cheddar )<br />    then<br />        System.out.println( $person.getName() </span>
						<span style="COLOR: rgb(0,0,0)">+</span>
						<span style="COLOR: rgb(0,0,0)"> </span>
						<span style="COLOR: rgb(0,0,0)">"</span>
						<span style="COLOR: rgb(0,0,0)"> does likes cheddar</span>
						<span style="COLOR: rgb(0,0,0)">"</span>
						<span style="COLOR: rgb(0,0,0)"> );<br />end<br /><br /></span>
				</div>
				<p>
				</p>
				<p class="MsoNormal" align="left">
				</p>
				<p class="MsoNormal" align="left">
						<span style="FONT-FAMILY: 宋体">这里我们先不探讨这两条</span>
						<span lang="EN-US">rule</span>
						<span style="FONT-FAMILY: 宋体">到的是什么意思，单从一个直观的感觉，这两条</span>
						<span lang="EN-US">rule</span>
						<span style="FONT-FAMILY: 宋体">在它们的</span>
						<span lang="EN-US">LHS</span>
						<span style="FONT-FAMILY: 宋体">中基本都是一样的，只是最后的</span>
						<span lang="EN-US" style="COLOR: blue">favouriteCheese</span>
						<span style="FONT-FAMILY: 宋体">，一条规则是等于</span>
						<span lang="EN-US" style="COLOR: blue">$cheddar</span>
						<span style="FONT-FAMILY: 宋体">，而另一条规则是不等于</span>
						<span lang="EN-US" style="COLOR: blue">$cheddar</span>
						<span style="FONT-FAMILY: 宋体">。下面是这两条规则的节点图：</span>
				</p>
				<p class="MsoNormal" align="center">
						<span style="FONT-FAMILY: 宋体">
								<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_8.png" />
						</span>
				</p>
				<p class="MsoNormal" align="center">
				</p>
				<p class="MsoNormal" style="TEXT-ALIGN: center" align="center">
						<b>
								<span lang="EN-US">Figure 5 . Node Sharing</span>
						</b>
				</p>
				<p class="MsoNormal" align="left">
						<span style="FONT-FAMILY: 宋体">从图上可以看到，编译后的</span>
						<span lang="EN-US">RETE</span>
						<span style="FONT-FAMILY: 宋体">网络中，</span>
						<span lang="EN-US">AlphaNode</span>
						<span style="FONT-FAMILY: 宋体">是共享的，而</span>
						<span lang="EN-US">BetaNode</span>
						<span style="FONT-FAMILY: 宋体">不是共享的。上面说的相等和不相等就体现在</span>
						<span lang="EN-US">BetaNode</span>
						<span style="FONT-FAMILY: 宋体">的不同。然后这两条规则有各自的</span>
						<span lang="EN-US">Terminal Node</span>
						<span style="FONT-FAMILY: 宋体">。</span>
				</p>
				<div align="left">
				</div>
				<p class="MsoNormal" align="left">
						<span lang="EN-US">&lt;!--[if !supportEmptyParas]--&gt; <o:p></o:p></span>
				</p>
				<div align="left">
				</div>
				<p class="MsoNormal" align="left">
						<span lang="EN-US">RETE</span>
						<span style="FONT-FAMILY: 宋体">算法的第二个部分是运行时（</span>
						<span lang="EN-US">runtime</span>
						<span style="FONT-FAMILY: 宋体">）。当一个应用</span>
						<span lang="EN-US">assert</span>
						<span style="FONT-FAMILY: 宋体">一个对象，引擎将数据传递到</span>
						<span lang="EN-US">root node</span>
						<span style="FONT-FAMILY: 宋体">。从那里，它进入</span>
						<span lang="EN-US">ObjectTypeNode</span>
						<span style="FONT-FAMILY: 宋体">并沿着网络向下传播。当数据匹配一个节点的条件，节点就将它记录到相应的内存中。这样做的原因有以下几点：主要的原因是可以带来更快的性能。虽然记住完全或部分匹配的对象需要内存，它提供了速度和可伸缩性的特点。当一条规则的所有条件都满足，这就是完全匹配。而只有部分条件满足，就是部分匹配。（我觉得引擎在每个节点都有其对应的内存来储存满足该节点条件的对象，这就造成了如果一个对象是完全匹配，那这个对象就会在每个节点的对应内存中都存有其映象。）</span>
				</p>
				<p class="MsoNormal" align="left">
				</p>
				<p class="MsoNormal" align="left">
						<b>
								<span lang="EN-US" style="FONT-SIZE: 14pt">2. Leaps </span>
						</b>
						<b>
								<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体">算法：</span>
						</b>
				</p>
				<p class="MsoNormal" align="left">
				</p>
				<p class="MsoNormal" align="left">
						<span lang="EN-US">Production systems </span>
						<span style="FONT-FAMILY: 宋体">的</span>
						<span lang="EN-US">Leaps </span>
						<span style="FONT-FAMILY: 宋体">算法使用了一种“</span>
						<span lang="EN-US">lazy</span>
						<span style="FONT-FAMILY: 宋体">”方法来评估条件（</span>
						<span lang="EN-US">conditions</span>
						<span style="FONT-FAMILY: 宋体">）。一种</span>
						<span lang="EN-US">Leaps</span>
						<span style="FONT-FAMILY: 宋体">算法的修改版本的实现，作为</span>
						<span lang="EN-US">Drools v3</span>
						<span style="FONT-FAMILY: 宋体">的一部分，尝试结合</span>
						<span lang="EN-US">Leaps</span>
						<span style="FONT-FAMILY: 宋体">和</span>
						<span lang="EN-US">RETE</span>
						<span style="FONT-FAMILY: 宋体">方法的最好的特点来处理</span>
						<span lang="EN-US">Working Memory</span>
						<span style="FONT-FAMILY: 宋体">中的</span>
						<span lang="EN-US">facts</span>
						<span style="FONT-FAMILY: 宋体">。</span>
				</p>
				<div align="left">
				</div>
				<p class="MsoNormal" align="left">
						<span style="FONT-FAMILY: 宋体">古典的</span>
						<span lang="EN-US">Leaps</span>
						<span style="FONT-FAMILY: 宋体">方法将所有的</span>
						<span lang="EN-US">asserted</span>
						<span style="FONT-FAMILY: 宋体">的</span>
						<span lang="EN-US">facts</span>
						<span style="FONT-FAMILY: 宋体">，按照其被</span>
						<span lang="EN-US">asserted</span>
						<span style="FONT-FAMILY: 宋体">在</span>
						<span lang="EN-US">Working Memory</span>
						<span style="FONT-FAMILY: 宋体">中的顺序（</span>
						<span lang="EN-US">FIFO</span>
						<span style="FONT-FAMILY: 宋体">），放在主堆栈中。它一个个的检查</span>
						<span lang="EN-US">facts</span>
						<span style="FONT-FAMILY: 宋体">，通过迭代匹配</span>
						<span lang="EN-US">data type </span>
						<span style="FONT-FAMILY: 宋体">的</span>
						<span lang="EN-US">facts</span>
						<span style="FONT-FAMILY: 宋体">集合来找出每一个相关规则的匹配。当一个匹配的数据被发现时，系统记住此时的迭代位置以备待会的继续迭代，并且激发规则结果（</span>
						<span lang="EN-US">consequence</span>
						<span style="FONT-FAMILY: 宋体">）。当结果（</span>
						<span lang="EN-US">consequence</span>
						<span style="FONT-FAMILY: 宋体">）执行完成以后，系统就会继续处理处于主堆栈顶部的</span>
						<span lang="EN-US">fact</span>
						<span style="FONT-FAMILY: 宋体">。如此反复。</span>
				</p>
		</div>
<img src ="http://www.blogjava.net/clant/aggbug/85142.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clant/" target="_blank">BPM </a> 2006-12-03 09:53 <a href="http://www.blogjava.net/clant/articles/85142.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（一）: 什么是Rule </title><link>http://www.blogjava.net/clant/articles/85141.html</link><dc:creator>BPM </dc:creator><author>BPM </author><pubDate>Sun, 03 Dec 2006 01:52:00 GMT</pubDate><guid>http://www.blogjava.net/clant/articles/85141.html</guid><wfw:comment>http://www.blogjava.net/clant/comments/85141.html</wfw:comment><comments>http://www.blogjava.net/clant/articles/85141.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clant/comments/commentRss/85141.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clant/services/trackbacks/85141.html</trackback:ping><description><![CDATA[
		<h2> </h2>
		<font face="Georgia">        学习JBoss Rules有几天了，因为这方面的中文资料较少，所以这几天都在看官网上的manual。这是一份不错的教程，我把我看的一些重要的东西翻译整理了一下，希望可以对想学习JBoss Rules的同学们提供一点帮助。<br />       在开始这份教程之前，我先简要介绍一下JBoss Rules：<br />       JBoss Rules 的前身是Codehaus的一个开源项目叫Drools。最近被纳入JBoss门下，更名为JBoss Rules，成为了JBoss应用服务器的规则引擎。<br />       Drools是为Java量身定制的基于Charles  Forgy的RETE算法的规则引擎的实现。具有了OO接口的RETE,使得商业规则有了更自然的表达。<br />  <br />       既然JBoss Rules是一个商业规则引擎，那我们就要先知道到底什么是Rules，即规则。在JBoss Rules中，规则是如何被表示的<br /><br /></font>
		<p class="MsoNormal">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 14pt">Rules<?XML:NAMESPACE PREFIX = O /?><o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">      一条规则是对商业知识的编码。一条规则有</span>
				<span lang="EN-US">attributes</span>
				<span style="FONT-FAMILY: 宋体">，一个</span>
				<span lang="EN-US">Left Hand Side</span>
				<span style="FONT-FAMILY: 宋体">（</span>
				<span lang="EN-US">LHS</span>
				<span style="FONT-FAMILY: 宋体">）和一个</span>
				<span lang="EN-US">Right Hand Side</span>
				<span style="FONT-FAMILY: 宋体">（</span>
				<span lang="EN-US">RHS</span>
				<span style="FONT-FAMILY: 宋体">）。</span>
				<span lang="EN-US">Drools</span>
				<span style="FONT-FAMILY: 宋体">允许下列几种</span>
				<span lang="EN-US">attributes</span>
				<span style="FONT-FAMILY: 宋体">：</span>
				<span lang="EN-US">salience</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">agenda-group</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">no-loop</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">auto-focus</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">duration</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">
						<span>
								<font face="Georgia" size="4">，</font>
						</span>
						<font face="Georgia" size="3">activation-group</font>
				</span>
				<font face="Georgia" size="3">
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">
								<span>
								</span>
						</span>
				</font>
				<span style="FONT-FAMILY: 宋体">。</span>
		</p>
		<font face="Georgia">
				<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
						<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
						<span style="COLOR: rgb(0,0,0)">rule “</span>
						<span style="COLOR: rgb(0,0,0)">&lt;</span>
						<span style="COLOR: rgb(0,0,0)">name</span>
						<span style="COLOR: rgb(0,0,0)">&gt;</span>
						<span style="COLOR: rgb(0,0,0)">”    <br />    </span>
						<span style="COLOR: rgb(0,0,0)">&lt;</span>
						<span style="COLOR: rgb(0,0,0)">attribute</span>
						<span style="COLOR: rgb(0,0,0)">&gt;</span>
						<span style="COLOR: rgb(0,0,0)"> </span>
						<span style="COLOR: rgb(0,0,0)">&lt;</span>
						<span style="COLOR: rgb(0,0,0)">value</span>
						<span style="COLOR: rgb(0,0,0)">&gt;</span>
						<span style="COLOR: rgb(0,0,0)">    <br />    when        <br />        </span>
						<span style="COLOR: rgb(0,0,0)">&lt;</span>
						<span style="COLOR: rgb(0,0,0)">LHS</span>
						<span style="COLOR: rgb(0,0,0)">&gt;</span>
						<span style="COLOR: rgb(0,0,0)">    <br />    then        <br />        </span>
						<span style="COLOR: rgb(0,0,0)">&lt;</span>
						<span style="COLOR: rgb(0,0,0)">RHS</span>
						<span style="COLOR: rgb(0,0,0)">&gt;</span>
						<span style="COLOR: rgb(0,0,0)">
								<br />end</span>
				</div>
		</font>
		<span style="FONT-FAMILY: 宋体">
				<br />      规则的</span>
		<font face="Verdana">
				<span lang="EN-US">LHS</span>
		</font>
		<span style="FONT-FAMILY: 宋体">由一个或多个条件（</span>
		<font face="Verdana">
				<span lang="EN-US">Conditions</span>
		</font>
		<span style="FONT-FAMILY: 宋体">）组成。当所有的条件（</span>
		<font face="Verdana">
				<span lang="EN-US">Conditions</span>
		</font>
		<span style="FONT-FAMILY: 宋体">）都满足并为真时，</span>
		<font face="Verdana">
				<span lang="EN-US">RHS</span>
		</font>
		<span style="FONT-FAMILY: 宋体">将被执行。</span>
		<font face="Verdana">
				<span lang="EN-US">RHS</span>
		</font>
		<span style="FONT-FAMILY: 宋体">被称为结果（</span>
		<font face="Verdana">
				<span lang="EN-US">Consequence</span>
		</font>
		<span style="FONT-FAMILY: 宋体">）。</span>
		<font face="Verdana">
				<span lang="EN-US">LHS</span>
		</font>
		<span style="FONT-FAMILY: 宋体">和</span>
		<font face="Verdana">
				<span lang="EN-US">RHS</span>
		</font>
		<span style="FONT-FAMILY: 宋体">类似于：</span>
		<font face="Verdana">
				<br />
		</font>
		<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="COLOR: rgb(0,0,255)">if</span>
				<span style="COLOR: rgb(0,0,0)"> ( </span>
				<span style="COLOR: rgb(0,0,0)">&lt;</span>
				<span style="COLOR: rgb(0,0,0)">LHS</span>
				<span style="COLOR: rgb(0,0,0)">&gt;</span>
				<span style="COLOR: rgb(0,0,0)"> ) {<br />    </span>
				<span style="COLOR: rgb(0,0,0)">&lt;</span>
				<span style="COLOR: rgb(0,0,0)">RHS</span>
				<span style="COLOR: rgb(0,0,0)">&gt;</span>
				<span style="COLOR: rgb(0,0,0)">
						<br />}<br /></span>
		</div>
		<br />
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">      规则可以通过</span>
				<span lang="EN-US">package</span>
				<span style="FONT-FAMILY: 宋体">关键字同一个命名空间（</span>
				<span lang="EN-US">namespace</span>
				<span style="FONT-FAMILY: 宋体">）相关联；其他的规则引擎可能称此为规则集（</span>
				<span lang="EN-US">Rule Set</span>
				<span style="FONT-FAMILY: 宋体">）。一个</span>
				<span lang="EN-US">package </span>
				<span style="FONT-FAMILY: 宋体">声明了</span>
				<span lang="EN-US">imports</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">global </span>
				<span style="FONT-FAMILY: 宋体">变量，</span>
				<span lang="EN-US">functions</span>
				<span style="FONT-FAMILY: 宋体">和</span>
				<span lang="EN-US">rules</span>
				<span style="FONT-FAMILY: 宋体">。</span>
		</p>
		<p class="MsoNormal">
				<br />
				<span style="FONT-FAMILY: 宋体">
				</span>
		</p>
		<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="COLOR: rgb(0,0,255)">package</span>
				<span style="COLOR: rgb(0,0,0)"> com.sample<br /><br /></span>
				<span style="COLOR: rgb(0,0,255)">import</span>
				<span style="COLOR: rgb(0,0,0)"> java.util.List<br /></span>
				<span style="COLOR: rgb(0,0,255)">import</span>
				<span style="COLOR: rgb(0,0,0)"> com.sample.Cheese<br /><br />global List cheeses<br /><br />function </span>
				<span style="COLOR: rgb(0,0,255)">void</span>
				<span style="COLOR: rgb(0,0,0)"> exampleFunction(Cheese cheese) {<br />    System.out.println( cheese );<br />}<br /><br />rule “A Cheesy Rule”<br />    when<br />        cheese : Cheese( type </span>
				<span style="COLOR: rgb(0,0,0)">==</span>
				<span style="COLOR: rgb(0,0,0)"> </span>
				<span style="COLOR: rgb(0,0,0)">"</span>
				<span style="COLOR: rgb(0,0,0)">stilton</span>
				<span style="COLOR: rgb(0,0,0)">"</span>
				<span style="COLOR: rgb(0,0,0)"> )<br />    then<br />        exampleFunction( cheese );<br />        cheeses.add( cheese );<br />end<br /></span>
		</div>
		<p>
		</p>
		<p class="MsoNormal">
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">      对新的数据和被修改的数据进行规则的匹配称为模式匹配（</span>
				<span lang="EN-US">Pattern Matching</span>
				<span style="FONT-FAMILY: 宋体">）。进行匹配的引擎称为推理机（</span>
				<span lang="EN-US">Inference Engine</span>
				<span style="FONT-FAMILY: 宋体">）。被访问的规则称为</span>
				<span lang="EN-US">ProductionMemory</span>
				<span style="FONT-FAMILY: 宋体">，被推理机进行匹配的数据称为</span>
				<span lang="EN-US">WorkingMemory</span>
				<span style="FONT-FAMILY: 宋体">。</span>
				<span lang="EN-US">Agenda</span>
				<span style="FONT-FAMILY: 宋体">管理被匹配规则的执行。推理机所采用的模式匹配算法有下列几种：</span>
				<span lang="EN-US">Linear</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">RETE</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">Treat</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">Leaps</span>
				<span style="FONT-FAMILY: 宋体">。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">      Drools</span>
				<span style="FONT-FAMILY: 宋体">采用了</span>
				<span lang="EN-US">RETE</span>
				<span style="FONT-FAMILY: 宋体">和</span>
				<span lang="EN-US">Leaps</span>
				<span style="FONT-FAMILY: 宋体">的实现。</span>
				<span lang="EN-US">Drools</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US">RETE</span>
				<span style="FONT-FAMILY: 宋体">实现被称为</span>
				<span lang="EN-US">ReteOO</span>
				<span style="FONT-FAMILY: 宋体">，表示</span>
				<span lang="EN-US">Drools</span>
				<span style="FONT-FAMILY: 宋体">对</span>
				<span lang="EN-US">Rete</span>
				<span style="FONT-FAMILY: 宋体">算法进行了加强和优化的实现。</span>
		</p>
		<img style="WIDTH: 531px; HEIGHT: 288px" src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_1.PNG" />
		<br />
		<br />
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">      一条规则的</span>
				<span lang="EN-US">LHS</span>
				<span style="FONT-FAMILY: 宋体">由</span>
				<span lang="EN-US">Conditional Element</span>
				<span style="FONT-FAMILY: 宋体">和域约束（</span>
				<span lang="EN-US">Field Constraints</span>
				<span style="FONT-FAMILY: 宋体">）。下面的例子显示了对一个</span>
				<span lang="EN-US">Cheese Fact</span>
				<span style="FONT-FAMILY: 宋体">使用了字面域约束（</span>
				<span lang="EN-US">Literal Field Constraint</span>
				<span style="FONT-FAMILY: 宋体">）</span>
		</p>
		<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="COLOR: rgb(0,0,0)">rule </span>
				<span style="COLOR: rgb(0,0,0)">"</span>
				<span style="COLOR: rgb(0,0,0)">Cheddar Cheese</span>
				<span style="COLOR: rgb(0,0,0)">"</span>
				<span style="COLOR: rgb(0,0,0)">
						<br />    when<br />        Cheese( type </span>
				<span style="COLOR: rgb(0,0,0)">==</span>
				<span style="COLOR: rgb(0,0,0)"> </span>
				<span style="COLOR: rgb(0,0,0)">"</span>
				<span style="COLOR: rgb(0,0,0)">cheddar</span>
				<span style="COLOR: rgb(0,0,0)">"</span>
				<span style="COLOR: rgb(0,0,0)"> )<br />    then<br />        System.out.println( </span>
				<span style="COLOR: rgb(0,0,0)">"</span>
				<span style="COLOR: rgb(0,0,0)">cheddar</span>
				<span style="COLOR: rgb(0,0,0)">"</span>
				<span style="COLOR: rgb(0,0,0)"> );<br />end<br /></span>
		</div>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">上面的这个例子类似于：</span>
		</p>
		<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="COLOR: rgb(0,0,255)">public</span>
				<span style="COLOR: rgb(0,0,0)"> </span>
				<span style="COLOR: rgb(0,0,255)">void</span>
				<span style="COLOR: rgb(0,0,0)"> cheddarCheese(Cheese cheese) {<br />    </span>
				<span style="COLOR: rgb(0,0,255)">if</span>
				<span style="COLOR: rgb(0,0,0)"> ( cheese.getType().equals(</span>
				<span style="COLOR: rgb(0,0,0)">"</span>
				<span style="COLOR: rgb(0,0,0)">cheddar</span>
				<span style="COLOR: rgb(0,0,0)">"</span>
				<span style="COLOR: rgb(0,0,0)">) {<br />        System.out.println( </span>
				<span style="COLOR: rgb(0,0,0)">"</span>
				<span style="COLOR: rgb(0,0,0)">cheddar</span>
				<span style="COLOR: rgb(0,0,0)">"</span>
				<span style="COLOR: rgb(0,0,0)"> );<br />    }<br />}<br /></span>
		</div>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">
				<?XML:NAMESPACE PREFIX = V /?>
				<v:shapetype id="_x0000_t75" coordsize="21600,21600" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f" o:spt="75" o:preferrelative="t">
						<v:stroke joinstyle="miter">
						</v:stroke>
						<v:formulas>
								<v:f eqn="if lineDrawn pixelLineWidth 0">
								</v:f>
								<v:f eqn="sum @0 1 0">
								</v:f>
								<v:f eqn="sum 0 0 @1">
								</v:f>
								<v:f eqn="prod @2 1 2">
								</v:f>
								<v:f eqn="prod @3 21600 pixelWidth">
								</v:f>
								<v:f eqn="prod @3 21600 pixelHeight">
								</v:f>
								<v:f eqn="sum @0 0 1">
								</v:f>
								<v:f eqn="prod @6 1 2">
								</v:f>
								<v:f eqn="prod @7 21600 pixelWidth">
								</v:f>
								<v:f eqn="sum @8 21600 0">
								</v:f>
								<v:f eqn="prod @7 21600 pixelHeight">
								</v:f>
								<v:f eqn="sum @10 21600 0">
								</v:f>
						</v:formulas>
						<v:path gradientshapeok="t" o:extrusionok="f" o:connecttype="rect">
						</v:path>
						<o:lock aspectratio="t" v:ext="edit">
						</o:lock>
				</v:shapetype>
				<v:shape id="_x0000_i1025" style="WIDTH: 415.5pt; HEIGHT: 197.25pt" type="#_x0000_t75">
						<v:imagedata src="file:///C:/DOCUME~1/zgn/LOCALS~1/Temp/msoclip1/02/clip_image001.png" o:title="">
						</v:imagedata>
				</v:shape>&lt;!--[if !vml]--&gt; &lt;!--[endif]--&gt; </span>
		<br />
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">      规则引擎实现了数据同逻辑的完全解耦。规则并不能被直接调用，因为它们不是方法或函数，规则的激发是对</span>
				<span lang="EN-US">WorkingMemory</span>
				<span style="FONT-FAMILY: 宋体">中数据变化的响应。结果（</span>
				<span lang="EN-US">Consequence</span>
				<span style="FONT-FAMILY: 宋体">，即</span>
				<span lang="EN-US">RHS</span>
				<span style="FONT-FAMILY: 宋体">）作为</span>
				<span lang="EN-US">LHS events</span>
				<span style="FONT-FAMILY: 宋体">完全匹配的</span>
				<span lang="EN-US">Listener</span>
				<span style="FONT-FAMILY: 宋体">。</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">当</span>
				<span lang="EN-US">rules</span>
				<span style="FONT-FAMILY: 宋体">被加入</span>
				<span lang="EN-US">Productioin Memory</span>
				<span style="FONT-FAMILY: 宋体">后，</span>
				<span lang="EN-US">rules</span>
				<span style="FONT-FAMILY: 宋体">被规则引擎用</span>
				<span lang="EN-US">RETE</span>
				<span style="FONT-FAMILY: 宋体">算法分解成一个图：</span>
		</p>
		<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_2.PNG" />
		<br />
		<br />
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">      当</span>
				<span lang="EN-US">Facts</span>
				<span style="FONT-FAMILY: 宋体">被</span>
				<span lang="EN-US">assert</span>
				<span style="FONT-FAMILY: 宋体">进入</span>
				<span lang="EN-US">WorkingMemory</span>
				<span style="FONT-FAMILY: 宋体">中后，规则引擎找到匹配的</span>
				<span lang="EN-US">ObjectTypeNode</span>
				<span style="FONT-FAMILY: 宋体">，然后将此</span>
				<span lang="EN-US">Fact</span>
				<span style="FONT-FAMILY: 宋体">传播到下一个节点。</span>
				<span lang="EN-US">ObjectTypeNode</span>
				<span style="FONT-FAMILY: 宋体">拥有一块内存来保存所有匹配的</span>
				<span lang="EN-US">facts</span>
				<span style="FONT-FAMILY: 宋体">。在我们的例子中，下一个节点是一个域约束（</span>
				<span lang="EN-US">Field Constraint</span>
				<span style="FONT-FAMILY: 宋体">），</span>
				<span lang="EN-US">type = = “cheddar”</span>
				<span style="FONT-FAMILY: 宋体">。如果某个</span>
				<span lang="EN-US">Cheese</span>
				<span style="FONT-FAMILY: 宋体">对象的类型不是“</span>
				<span lang="EN-US">cheddar</span>
				<span style="FONT-FAMILY: 宋体">”，这个</span>
				<span lang="EN-US">fact</span>
				<span style="FONT-FAMILY: 宋体">将不会被传播到网络的下一个节点。如果是“</span>
				<span lang="EN-US">cheddar</span>
				<span style="FONT-FAMILY: 宋体">”类型，它将被记录到</span>
				<span lang="EN-US">AlphaNode</span>
				<span style="FONT-FAMILY: 宋体">的内存中，并传播到网络的下一个节点。</span>
				<span lang="EN-US">AlphaNode</span>
				<span style="FONT-FAMILY: 宋体">是古典</span>
				<span lang="EN-US">RETE</span>
				<span style="FONT-FAMILY: 宋体">术语，它是一个单输入</span>
				<span lang="EN-US">/</span>
				<span style="FONT-FAMILY: 宋体">单输出的节点。最后通过</span>
				<span lang="EN-US">AlphaNode</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US">fact</span>
				<span style="FONT-FAMILY: 宋体">被传播到</span>
				<span lang="EN-US">Terminal Node</span>
				<span style="FONT-FAMILY: 宋体">。</span>
				<span lang="EN-US">Terminal Node</span>
				<span style="FONT-FAMILY: 宋体">是最终节点，到此我们说这条规则被完全匹配，并准备激发。</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">      当一条规则被完全匹配，它并没有立刻被激发（在</span>
				<span lang="EN-US">RETE</span>
				<span style="FONT-FAMILY: 宋体">中是这样，但在</span>
				<span lang="EN-US">Leaps</span>
				<span style="FONT-FAMILY: 宋体">中它会立刻被激发）。这条规则和与其匹配的</span>
				<span lang="EN-US">facts</span>
				<span style="FONT-FAMILY: 宋体">将激活被放入</span>
				<span lang="EN-US">Agenda</span>
				<span style="FONT-FAMILY: 宋体">，由</span>
				<span lang="EN-US">Agenda</span>
				<span style="FONT-FAMILY: 宋体">来负责安排激发</span>
				<span lang="EN-US">Activations</span>
				<span style="FONT-FAMILY: 宋体">（指的是</span>
				<span lang="EN-US">rule + the matched facts</span>
				<span style="FONT-FAMILY: 宋体">）。</span>
		</p>
		<p class="MsoNormal">
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">下面的图很清楚的说明了</span>
				<span lang="EN-US">Drools</span>
				<span style="FONT-FAMILY: 宋体">规则引擎的执行过程：</span>
		</p>
		<br />
		<p class="MsoNormal">
				<img src="http://www.blogjava.net/images/blogjava_net/guangnian0412/11768/o_3.PNG" />
		</p>
		<p class="MsoNormal">
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">   数据被</span>
				<span lang="EN-US">assert</span>
				<span style="FONT-FAMILY: 宋体">进</span>
				<span lang="EN-US">WorkingMemory</span>
				<span style="FONT-FAMILY: 宋体">后，和</span>
				<span lang="EN-US">RuleBase</span>
				<span style="FONT-FAMILY: 宋体">中的</span>
				<span lang="EN-US">rule</span>
				<span style="FONT-FAMILY: 宋体">进行匹配（确切的说应该是</span>
				<span lang="EN-US">rule</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US">LHS</span>
				<span style="FONT-FAMILY: 宋体">），如果匹配成功这条</span>
				<span lang="EN-US">rule</span>
				<span style="FONT-FAMILY: 宋体">连同和它匹配的数据（此时就叫做</span>
				<span lang="EN-US">Activation</span>
				<span style="FONT-FAMILY: 宋体">）一起被放入</span>
				<span lang="EN-US">Agenda</span>
				<span style="FONT-FAMILY: 宋体">，等待</span>
				<span lang="EN-US">Agenda</span>
				<span style="FONT-FAMILY: 宋体">来负责安排激发</span>
				<span lang="EN-US">Activation</span>
				<span style="FONT-FAMILY: 宋体">（其实就是执行</span>
				<span lang="EN-US">rule</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US">RHS</span>
				<span style="FONT-FAMILY: 宋体">），上图中的菱形部分就是在</span>
				<span lang="EN-US">Agenda</span>
				<span style="FONT-FAMILY: 宋体">中来执行的，</span>
				<span lang="EN-US">Agenda</span>
				<span style="FONT-FAMILY: 宋体">就会根据冲突解决策略来安排</span>
				<span lang="EN-US">Activation</span>
				<span style="FONT-FAMILY: 宋体">的执行顺序。</span>
		</p>
<img src ="http://www.blogjava.net/clant/aggbug/85141.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clant/" target="_blank">BPM </a> 2006-12-03 09:52 <a href="http://www.blogjava.net/clant/articles/85141.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>