﻿<?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-Junky's IT Notebook-随笔分类-JBoss</title><link>http://www.blogjava.net/junky/category/11781.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 20 Dec 2007 03:54:00 GMT</lastBuildDate><pubDate>Thu, 20 Dec 2007 03:54:00 GMT</pubDate><ttl>60</ttl><item><title>[转]Tomcat调试经验。</title><link>http://www.blogjava.net/junky/archive/2007/12/17/168182.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Mon, 17 Dec 2007 03:22:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/12/17/168182.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/168182.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/12/17/168182.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/168182.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/168182.html</trackback:ping><description><![CDATA[<p>Tomcat调试经验。一些自己总结的，一些是他人的经验。</p>
<p>1 Q：<br />
2006-2-27 21:31:59 org.apache.coyote.http11.Http11Protocol init<br />
严重: Error initializing endpoint<br />
java.net.SocketException: Permission denied: listen failed<br />
&nbsp;&nbsp;&nbsp; at java.net.PlainSocketImpl.socketListen(Native Method)<br />
&nbsp;&nbsp;&nbsp; at java.net.PlainSocketImpl.listen(PlainSocketImpl.java:343)<br />
&nbsp;&nbsp;&nbsp; at java.net.ServerSocket.bind(ServerSocket.java:319)<br />
&nbsp;&nbsp;&nbsp; at java.net.ServerSocket.&lt;init&gt;(ServerSocket.java:185)<br />
&nbsp;&nbsp;&nbsp; at java.net.ServerSocket.&lt;init&gt;(ServerSocket.java:141)<br />
&nbsp;&nbsp;&nbsp; at </p>
<p>org.apache.tomcat.util.net.DefaultServerSocketFactory.createSocket(DefaultServerSocketFactory.java:49)</p>
<p>A：<br />
要改一下端口，在TOMCAT_HOME\conf\server.xml 把8080改成其他的。<br />
启动之前，先用 netstat -a 检查一下 port 是不</p>
<p>是已经被使用了。有可能被ORACLE或者打开的Eclipse程序占用。<br />
OracleOraHome92TNSListenerLISTENER1</p>
<p>2&nbsp;&nbsp; Q：<br />
JasperException: Failed to load or instantiate TagLibraryValidator class: org.apache.taglibs.standard.tlv.JstlCoreTLV <br />
A: 原因lib中缺少standard.jar和servlet-api.jar两个文件，将两个文件加入用户库中。</p>
<p>3&nbsp;&nbsp;&nbsp; 错误：<br />
java.lang.NullPointerException <br />
原因： 发现 dao 实例、 manage 实例等需要注入的东西没有被注入 <br />
解决：这个时候，你应该查看日志文件；默认是应用服务器的 log 文件，比如 Tomcat 就是 [Tomcat 安装目录 ]/logs ；你会发现提示你： <br />
可能是： <br />
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sf' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is org.hibernate.HibernateException: could not configure from URL: file:src/hibernate.cfg.xml <br />
org.hibernate.HibernateException: could not configure from URL: file:src/hibernate.cfg.xml <br />
&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. <br />
Caused by: java.io.FileNotFoundException: src\hibernate.cfg.xml <br />
可能是： <br />
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is org.hibernate.MappingException: Resource: com/mcc/coupon/model/UserRole.hbm.xml not found <br />
org.hibernate.MappingException: Resource: com/mcc/coupon/model/UserRole.hbm.xml not found <br />
然后你就知道原因是因为配置文件的解析出了错误，这个通过 Web 页面是看不出来的。 <br />
更多的是持久化影射文件出的错误；导致了没有被解析；当然你需要的功能就无法使用了。 <br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
4&nbsp;&nbsp; 错误：<br />
StandardWrapperValve[action]: Servlet.service() for servlet action threw exception<br />
javax.servlet.jsp.JspException: Cannot retrieve mapping for action /settlementTypeManage <br />
或者： <br />
&nbsp;&nbsp;&nbsp;&nbsp; type Status report<br />
&nbsp;&nbsp;&nbsp;&nbsp; message Servlet action is not available <br />
&nbsp;&nbsp;&nbsp;&nbsp; description The requested resource (Servlet action is not available) is not available. </p>
<p>原因： 同 3<br />
&nbsp;&nbsp;<br />
5&nbsp;&nbsp; 错误：<br />
StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exception <br />
java.lang.ClassNotFoundException: org.apache.struts.taglib.bean.CookieTei <br />
界面错误具体描述：<br />
org.apache.jasper.JasperException: Failed to load or instantiate TagExtraInfo class: org.apache.struts.taglib.bean.CookieTei</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp; 原因与解决： <br />
&nbsp;&nbsp; &lt;方案一&gt;你的&#8220;html:&#8221;开头的标签没有放在一个&lt;html:form&gt;中<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;方案二&gt;重新启动你的应用服务器，自动就没有这个问题了</p>
<p>6 错误：<br />
Exception in thread "main" org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update<br />
原因与解决：<br />
&nbsp;&nbsp;&nbsp;&nbsp; 因为Hibernate Tools（或者Eclipse本身的Database Explorer）生成*.hbn.xml工具中包含有catalog="***"（*表示数据库名称）这样的属性,将该属性删除就可以了</p>
<p>7&nbsp;&nbsp; 错误：<br />
org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations)<br />
原因与解决：<br />
方法1 删除Set方的cascade<br />
方法2 解决关联关系后，再删除<br />
方法3 在many-to-one方增加cascade 但值不能是none<br />
最后一招：<br />
检查一下hashCode equals是否使用了id作为唯一标示的选项了；我用uuid.hex时是没有问题的；但是用了native，就不行了，怎么办？删除啊！<br />
这个错误可以参见我的blog文章：<br />
<a href="http://www.blogjava.net/crazycy/archive/2006/06/24/54939.html">http://www.blogjava.net/crazycy/archive/2006/06/24/54939.html</a><br />
&nbsp;&nbsp;<br />
8&nbsp;&nbsp;&nbsp;&nbsp; 错误：<br />
exception javax.servlet.ServletException: BeanUtils.populat<br />
root cause<br />
java.lang.IllegalArgumentException:Cannot invoke ***Form.set*** - argument type mismatch<br />
原因<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个问题很奇怪的说，为啥说奇怪呢？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 先说问题的原因：问题发生如下两种情况：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Form中是Date类型<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上传文件时<br />
为什么说奇怪呢？主要针对Form是日期型的来说的；因为我做过N多系统Form中都是用java.util.Date，界面使用&lt;html:text property=&#8221;date&#8221;/&gt;;都是没有问题的。所以第一次遇到这个错误时，捣鼓了一个下午。<br />
解决：<br />
第一个问题：你把Date换成String；在Action中进行转换；当然转换要借助于SimpleDateFormate方法喽<br />
第二个问题：记得在form中增加enctype="multipart/form-data" 呵呵</p>
<p>9&nbsp;&nbsp; 问题：<br />
今天用Tomcat5.5.12，发现原来很好用的系统不能用了，反复测试发现页面中不能包含 taglib，否则会出现以下提示：<br />
HTTP Status 500 -type Exception report<br />
Message&nbsp;&nbsp;<br />
description The server encountered an internal error () that prevented it from fulfilling this request.<br />
exception<br />
org.apache.jasper.JasperException: /index.jsp(1,1) Unable to read TLD "META-INF/tlds/struts-bean.tld" from JAR file "file:*****/WEB-INF/lib/struts.jar":<br />
原因：<br />
更新了工程用的lib文件夹下的jar，发布时也发布了servlet.jar和jsp-api.jar。<br />
解决：<br />
把jsp-api.jar删除就解决这个问题了。</p>
<p><br />
10&nbsp;&nbsp; 问题：Tomcat5.0.20中差错可以通过[Tomcat安装目录]/logs下的localhost_log.2006-07-14.txt类似的文件看具体的错误日志，但是在5.5中就找不到了<br />
原因与解决：<br />
我把[Tomcat安装目录]/bin下的tomcat5w.exe的logging标签捣鼓了一会，然后重起就有了。<br />
原因具体说不准，用非安装版也有这个问题。</p>
<p>最终解决方案：<br />
&nbsp;&nbsp;&nbsp;<a href="http://tomcat.apache.org/tomcat-5.5-doc/logging.html">http://tomcat.apache.org/tomcat-5.5-doc/logging.html</a><br />
&nbsp;&nbsp;&nbsp;<br />
11 错误：javax.servlet.ServletException: Cannot find bean page in any scope<br />
原因 1：检查程序，有可能是jsp中式到的bean在程序中没有运行到，所以不存在。</p>
<p>12 错误：No action instance for path /MenuManage could be created<br />
原因：sturts配置问题，找不到Form对应的bean。检查jsp文件和struts-config.xml文件。</p>
<p>13 错误：org.hibernate.hql.ast.QuerySyntaxException: address is not mapped. [from address]<br />
原因：检查对应bean中数据库名是否和hibernate定义的相同，注意大小写。</p>
<p>14 错误：org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter in class: com.xxx.perrsistence.Test, setter method of property: id<br />
原因：对应bean中set方法数据类型和hibernate配置文件中定义的类型是否一致</p>
<img src ="http://www.blogjava.net/junky/aggbug/168182.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-12-17 11:22 <a href="http://www.blogjava.net/junky/archive/2007/12/17/168182.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBoss Rules 学习（二）: 一些专业术语的解释 </title><link>http://www.blogjava.net/junky/archive/2006/06/02/49824.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Thu, 01 Jun 2006 16:24:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/06/02/49824.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/49824.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/06/02/49824.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/49824.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/49824.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 Rules框架的专业术语，下面对这些术语作出进一步的解释，可以使JBoss Rules更加容易理解。<br /><br /></font>
		<p class="MsoNormal">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 14pt">1.Rete </span>
				</b>
				<b>
						<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体">算法</span>
				</b>
				<span style="FONT-FAMILY: 宋体">：</span>
		</p>
		<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>
		</p>
		<p class="MsoNormal">
				<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">
				<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 = = “Mark” </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">ObjectTypeNode</span>
				<span style="FONT-FAMILY: 宋体">是一种特殊的</span>
				<span lang="EN-US">AlphaNode</span>
				<span style="FONT-FAMILY: 宋体">。</span>
		</p>
		<p class="MsoNormal">
				<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">BetaNodes </span>
				<span style="FONT-FAMILY: 宋体">被用来对</span>
				<span lang="EN-US">2</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">a single object</span>
				<span style="FONT-FAMILY: 宋体">。在一些情况下，一个规则引擎可能实现一些</span>
				<span lang="EN-US">BetaNodes</span>
				<span style="FONT-FAMILY: 宋体">来处理</span>
				<span lang="EN-US">existential conditions (</span>
				<span style="FONT-FAMILY: 宋体">‘与’条件</span>
				<span lang="EN-US">)</span>
				<span style="FONT-FAMILY: 宋体">和</span>
				<span lang="EN-US">negated conditional element</span>
				<span style="FONT-FAMILY: 宋体">（‘非’条件）。很多现代的</span>
				<span lang="EN-US">RETE</span>
				<span style="FONT-FAMILY: 宋体">实现通过</span>
				<span lang="EN-US">hash</span>
				<span style="FONT-FAMILY: 宋体">或</span>
				<span lang="EN-US">b-tree indexes </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">Terminal nodes </span>
				<span style="FONT-FAMILY: 宋体">被用来表明一条规则已经匹配了它的所有条件（</span>
				<span lang="EN-US">conditions</span>
				<span style="FONT-FAMILY: 宋体">）。在一些情况下，一条带有“或”条件的规则可以有超过一个的</span>
				<span lang="EN-US">terminal node</span>
				<span style="FONT-FAMILY: 宋体">。从一个</span>
				<span lang="EN-US">RETE</span>
				<span style="FONT-FAMILY: 宋体">网络的观点来看，一条带有“或”条件的规则实际上只是</span>
				<span lang="EN-US">2</span>
				<span style="FONT-FAMILY: 宋体">个拥有很多共享节点的节点。</span>
		</p>
		<p class="MsoNormal">
				<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">
				<span lang="EN-US">&lt;!--[if !supportEmptyParas]--&gt; <?XML:NAMESPACE PREFIX = O /?><o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 14pt">2.Leaps </span>
				</b>
				<b>
						<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体">算法：</span>
				</b>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 14pt">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal">
				<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>
		<p class="MsoNormal">
				<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>
		<p class="MsoNormal">
				<span lang="EN-US">&lt;!--[if !supportEmptyParas]--&gt; </span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 14pt">3.RuleBase:<o:p></o:p></span>
				</b>
		</p>
		<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>
		</p>
		<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>
		</p>
		<p class="MsoNormal">
		</p>
		<p class="MsoNormal">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 14pt">4.WorkingMemory:<o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal">
				<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">rule engine</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>
		</p>
		<h3>
				<font size="3">
						<span lang="EN-US">4.1 Facts</span>
				</font>
		</h3>
		<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>
		</p>
		<h3>
				<span lang="EN-US">
						<font size="3">4.2 Assertion</font>
				</span>
		</h3>
		<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 facts</span>
				<span style="FONT-FAMILY: 宋体">之后，你还要调用“</span>
				<span lang="EN-US">fireAllRules()</span>
				<span style="FONT-FAMILY: 宋体">”方法来启动匹配。</span>
		</p>
		<p class="MsoNormal">
				<span style="COLOR: rgb(255,102,0); FONT-FAMILY: 宋体">（</span>
				<span lang="EN-US" style="COLOR: rgb(255,102,0)">WorkingMemory.assertObject(yourObjcet)</span>
				<span style="COLOR: rgb(255,102,0); FONT-FAMILY: 宋体">只是进行</span>
				<span lang="EN-US" style="COLOR: rgb(255,102,0)">assertion</span>
				<span style="COLOR: rgb(255,102,0); FONT-FAMILY: 宋体">的一种</span>
				<span lang="EN-US" style="COLOR: rgb(255,102,0)">regular</span>
				<span style="COLOR: rgb(255,102,0); FONT-FAMILY: 宋体">方法，还存在有一种称为</span>
				<span lang="EN-US" style="COLOR: rgb(255,102,0)">logical assertion</span>
				<span style="COLOR: rgb(255,102,0); FONT-FAMILY: 宋体">的动作）。</span>
				<span lang="EN-US" style="COLOR: rgb(255,102,0)">
						<o:p>
						</o:p>
				</span>
		</p>
		<h3>
				<span lang="EN-US">
						<font size="3">4.3 Retraction</font>
				</span>
		</h3>
		<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">fact</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US">rules</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>
		</p>
		<h3>
				<span lang="EN-US">
						<font size="3">4.4 Modification</font>
				</span>
		</h3>
		<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">rule</span>
				<span style="FONT-FAMILY: 宋体">会因此而被再次激发。当你修改一个</span>
				<span lang="EN-US">fact</span>
				<span style="FONT-FAMILY: 宋体">的时候，就告诉了规则引擎它的状态已经改变了。</span>
		</p>
		<h3>
				<span lang="EN-US">
						<font size="3">4.5 Globals</font>
				</span>
		</h3>
		<p class="MsoNormal">
				<span lang="EN-US">Globals</span>
				<span style="FONT-FAMILY: 宋体">是一个能够被传进规则引擎的命名的对象。大多数这些对象被用来作为静态信息或服务。这些服务被用在一条规则的</span>
				<span lang="EN-US">RHS</span>
				<span style="FONT-FAMILY: 宋体">，或者可能是从规则引擎返回对象的一种方法。</span>
		</p>
		<h3>
				<span lang="EN-US">
						<font size="3">4.6 Property Change Listener</font>
				</span>
		</h3>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">如果你的</span>
				<span lang="EN-US">fact</span>
				<span style="FONT-FAMILY: 宋体">对象是</span>
				<span lang="EN-US">java bean</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">Proxy libraries</span>
				<span style="FONT-FAMILY: 宋体">将会帮助实现这一切。</span>
		</p>
		<h3>
				<span lang="EN-US">
						<font size="3">4.7 Stateless and Statefull Sessions</font>
				</span>
		</h3>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">基于</span>
				<span lang="EN-US">RETE</span>
				<span style="FONT-FAMILY: 宋体">算法的规则引擎是有状态的规则引擎。有状态带来的好处是改变能够被通知和累计</span>
				<span lang="EN-US">facts</span>
				<span style="FONT-FAMILY: 宋体">（</span>
				<span lang="EN-US">accumulating facts</span>
				<span style="FONT-FAMILY: 宋体">）。</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">尽管如此，在很多情况下，所有提供给规则引擎的的</span>
				<span lang="EN-US">facts</span>
				<span style="FONT-FAMILY: 宋体">都是最新的，紧接着规则被激活。在这种情况下仅仅需要一种无状态的模式。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">JSR-94 API</span>
				<span style="FONT-FAMILY: 宋体">指定了有状态和无状态的模式，但是在</span>
				<span lang="EN-US">native API</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>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">&lt;!--[if !supportEmptyParas]--&gt; </span>
		</p>
		<p class="MsoNormal">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 14pt">5. Agenda:<o:p></o:p></span>
				</b>
		</p>
		<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">facts</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">RHS</span><span style="FONT-FAMILY: 宋体">或是</span><span lang="EN-US">java code</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">rule actions</span><span style="FONT-FAMILY: 宋体">在这里被激发）。</span></p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">注意：这个过程是一个轮流发生的过程，一条规则的激发可能引起</span>
				<span lang="EN-US">WorkingMemory actions</span>
				<span style="FONT-FAMILY: 宋体">的发生。当</span>
				<span lang="EN-US">WorkingMemory actions</span>
				<span style="FONT-FAMILY: 宋体">发生时，应该没有规则正在被激发。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">fireAllRules()</span>
				<span style="FONT-FAMILY: 宋体">方法引起</span>
				<span lang="EN-US">Agenda evaluation</span>
				<span style="FONT-FAMILY: 宋体">，最终“</span>
				<span lang="EN-US">activations</span>
				<span style="FONT-FAMILY: 宋体">”激发。这个过程一直重复直到</span>
				<span lang="EN-US">Agenda</span>
				<span style="FONT-FAMILY: 宋体">被清空，此时控制权就回到应用程序中。</span>
		</p>
		<h3>
				<span lang="EN-US">
						<font size="3">5.1 Conflict Resultion</font>
				</span>
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</h3>
		<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">4</span>
				<span style="FONT-FAMILY: 宋体">种，按照优先级排列如下：</span>
				<span lang="EN-US">Salience</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">FIFO</span>
				<span style="FONT-FAMILY: 宋体">（先进先出），</span>
				<span lang="EN-US">Total Recency </span>
				<span style="FONT-FAMILY: 宋体">和</span>
				<span lang="EN-US">Load order</span>
				<span style="FONT-FAMILY: 宋体">。</span>
		</p>
		<p class="MsoNormal">
				<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">
				<span style="FONT-FAMILY: 宋体">优先级最低的策略是</span>
				<span lang="EN-US">Load order</span>
				<span style="FONT-FAMILY: 宋体">，就是按照</span>
				<span lang="EN-US">rule</span>
				<span style="FONT-FAMILY: 宋体">被声明的顺序。</span>
		</p>
		<h3>
				<span lang="EN-US">
						<font size="3">5.2 Agenda Groups</font>
				</span>
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</h3>
		<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 for rules</span>
				<span style="FONT-FAMILY: 宋体">才是有效的。</span>
		</p>
		<h3>
				<span lang="EN-US">
						<font size="3">5.3 Filters</font>
				</span>
				<span lang="EN-US">
				</span>
		</h3>
		<p class="MsoNormal">
				<span lang="EN-US">Filter</span>
				<span style="FONT-FAMILY: 宋体">是</span>
				<span lang="EN-US">filter</span>
				<span style="FONT-FAMILY: 宋体">接口的可选实现，用来允许或禁止一个</span>
				<span lang="EN-US">activation</span>
				<span style="FONT-FAMILY: 宋体">能够被激发。</span>
		</p>
<img src ="http://www.blogjava.net/junky/aggbug/49824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-06-02 00:24 <a href="http://www.blogjava.net/junky/archive/2006/06/02/49824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBoss Rules 学习（一）: 什么是Rule </title><link>http://www.blogjava.net/junky/archive/2006/06/02/49823.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Thu, 01 Jun 2006 16:23:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/06/02/49823.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/49823.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/06/02/49823.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/49823.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/49823.html</trackback:ping><description><![CDATA[
		<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" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
						<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 o:extrusionok="f" gradientshapeok="t" o:connecttype="rect">
						</v:path>
						<o:lock v:ext="edit" aspectratio="t">
						</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/junky/aggbug/49823.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-06-02 00:23 <a href="http://www.blogjava.net/junky/archive/2006/06/02/49823.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>