??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲片国产一区一级在线观看,亚洲国产综合精品中文字幕,国产精品亚洲精品久久精品http://www.tkk7.com/junky/category/11781.htmlzh-cnThu, 20 Dec 2007 03:54:00 GMTThu, 20 Dec 2007 03:54:00 GMT60[转]Tomcat调试l验?/title><link>http://www.tkk7.com/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.tkk7.com/junky/archive/2007/12/17/168182.html</guid><wfw:comment>http://www.tkk7.com/junky/comments/168182.html</wfw:comment><comments>http://www.tkk7.com/junky/archive/2007/12/17/168182.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/junky/comments/commentRss/168182.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/junky/services/trackbacks/168182.html</trackback:ping><description><![CDATA[<p>Tomcat调试l验。一些自己ȝ的,一些是他h的经验?/p> <p>1 QQ?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 />     at java.net.PlainSocketImpl.socketListen(Native Method)<br />     at java.net.PlainSocketImpl.listen(PlainSocketImpl.java:343)<br />     at java.net.ServerSocket.bind(ServerSocket.java:319)<br />     at java.net.ServerSocket.<init>(ServerSocket.java:185)<br />     at java.net.ServerSocket.<init>(ServerSocket.java:141)<br />     at </p> <p>org.apache.tomcat.util.net.DefaultServerSocketFactory.createSocket(DefaultServerSocketFactory.java:49)</p> <p>AQ?br /> 要改一下端口,在TOMCAT_HOME\conf\server.xml ?080Ҏ其他的?br /> 启动之前Q先?netstat -a 查一?port 是不</p> <p>是已l被使用了。有可能被ORACLE或者打开的EclipseE序占用?br /> OracleOraHome92TNSListenerLISTENER1</p> <p>2   QQ?br /> JasperException: Failed to load or instantiate TagLibraryValidator class: org.apache.taglibs.standard.tlv.JstlCoreTLV <br /> A: 原因lib中缺standard.jar和servlet-api.jar两个文gQ将两个文g加入用户库中?/p> <p>3    错误Q?br /> java.lang.NullPointerException <br /> 原因Q?发现 dao 实例?manage 实例{需要注入的东西没有被注?<br /> 解决Q这个时候,你应该查看日志文Ӟ默认是应用服务器?log 文gQ比?Tomcat 是 [Tomcat 安装目录 ]/logs Q你会发现提CZQ?<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 /> ………………………. <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 /> 然后你就知道原因是因为配|文件的解析Z错误Q这个通过 Web 面是看不出来的?<br /> 更多的是持久化媄文件出的错误;D了没有被解析Q当然你需要的功能无法用了?<br />   <br />   <br /> 4   错误Q?br /> StandardWrapperValve[action]: Servlet.service() for servlet action threw exception<br /> javax.servlet.jsp.JspException: Cannot retrieve mapping for action /settlementTypeManage <br /> 或者: <br />      type Status report<br />      message Servlet action is not available <br />      description The requested resource (Servlet action is not available) is not available. </p> <p>原因Q??3<br />   <br /> 5   错误Q?br /> StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exception <br /> java.lang.ClassNotFoundException: org.apache.struts.taglib.bean.CookieTei <br /> 界面错误具体描述Q?br /> org.apache.jasper.JasperException: Failed to load or instantiate TagExtraInfo class: org.apache.struts.taglib.bean.CookieTei</p> <p><br />      原因与解冻I <br />    <Ҏ一>你的“html:”开头的标签没有攑֜一?lt;html:form>?br />       <Ҏ?gt;重新启动你的应用服务器,自动没有这个问题了</p> <p>6 错误Q?br /> Exception in thread "main" org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update<br /> 原因与解冻I<br />      因ؓHibernate ToolsQ或者Eclipse本n的Database ExplorerQ生?.hbn.xml工具中包含有catalog="***"Q?表示数据库名Uͼq样的属?该属性删除就可以?/p> <p>7   错误Q?br /> org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations)<br /> 原因与解冻I<br /> Ҏ1 删除Set方的cascade<br /> Ҏ2 解决兌关系后,再删?br /> Ҏ3 在many-to-one方增加cascade 但g能是none<br /> 最后一招:<br /> 查一下hashCode equals是否使用了id作ؓ唯一标示的选项了;我用uuid.hex时是没有问题的;但是用了nativeQ就不行了,怎么办?删除啊!<br /> q个错误可以参见我的blog文章Q?br /> <a href="http://www.tkk7.com/crazycy/archive/2006/06/24/54939.html">http://www.tkk7.com/crazycy/archive/2006/06/24/54939.html</a><br />   <br /> 8     错误Q?br /> exception javax.servlet.ServletException: BeanUtils.populat<br /> root cause<br /> java.lang.IllegalArgumentException:Cannot invoke ***Form.set*** - argument type mismatch<br /> 原因<br />        q个问题很奇怪的_为啥说奇怪呢Q?br />        先说问题的原因:问题发生如下两种情况Q?br />            Form中是Datecd<br />            上传文g?br /> Z么说奇怪呢Q主要针对Form是日期型的来说的Q因为我做过N多系lForm中都是用java.util.DateQ界面?lt;html:text property=”date”/>;都是没有问题的。所以第一ơ遇到这个错误时Q捣鼓了一个下午?br /> 解决Q?br /> W一个问题:你把Date换成StringQ在Action中进行{换;当然转换要借助于SimpleDateFormateҎ?br /> W二个问题:记得在form中增加enctype="multipart/form-data" 呵呵</p> <p>9   问题Q?br /> 今天用Tomcat5.5.12Q发现原来很好用的系l不能用了,反复试发现面中不能包?taglibQ否则会出现以下提示Q?br /> HTTP Status 500 -type Exception report<br /> Message  <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 /> 原因Q?br /> 更新了工E用的lib文g夹下的jarQ发布时也发布了servlet.jar和jsp-api.jar?br /> 解决Q?br /> 把jsp-api.jar删除p册个问题了?/p> <p><br /> 10   问题QTomcat5.0.20中差错可以通过[Tomcat安装目录]/logs下的localhost_log.2006-07-14.txtcM的文件看具体的错误日志,但是?.5中就找不C<br /> 原因与解冻I<br /> 我把[Tomcat安装目录]/bin下的tomcat5w.exe的logging标签捣鼓了一会,然后重v有了?br /> 原因具体说不准,用非安装版也有这个问题?/p> <p>最l解x案:<br />    <a >http://tomcat.apache.org/tomcat-5.5-doc/logging.html</a><br />    <br /> 11 错误Qjavax.servlet.ServletException: Cannot find bean page in any scope<br /> 原因 1Q检查程序,有可能是jsp中式到的bean在程序中没有q行刎ͼ所以不存在?/p> <p>12 错误QNo action instance for path /MenuManage could be created<br /> 原因Qsturts配置问题Q找不到Form对应的bean。检查jsp文g和struts-config.xml文g?/p> <p>13 错误Qorg.hibernate.hql.ast.QuerySyntaxException: address is not mapped. [from address]<br /> 原因Q检查对应bean中数据库名是否和hibernate定义的相同,注意大小写?/p> <p>14 错误Qorg.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter in class: com.xxx.perrsistence.Test, setter method of property: id<br /> 原因Q对应bean中setҎ数据cd和hibernate配置文g中定义的cd是否一?/p> <img src ="http://www.tkk7.com/junky/aggbug/168182.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/junky/" target="_blank">junky</a> 2007-12-17 11:22 <a href="http://www.tkk7.com/junky/archive/2007/12/17/168182.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBoss Rules 学习Q二Q? 一些专业术语的解释 http://www.tkk7.com/junky/archive/2006/06/02/49824.htmljunkyjunkyThu, 01 Jun 2006 16:24:00 GMThttp://www.tkk7.com/junky/archive/2006/06/02/49824.htmlhttp://www.tkk7.com/junky/comments/49824.htmlhttp://www.tkk7.com/junky/archive/2006/06/02/49824.html#Feedback0http://www.tkk7.com/junky/comments/commentRss/49824.htmlhttp://www.tkk7.com/junky/services/trackbacks/49824.html?/font> JBoss Rules 学习Q一Q?什么是Rule 中,我们介绍了JBoss Rules中对Rule的表C,其中有很多JBoss Rules框架的专业术语,下面对这些术语作一步的解释Q可以JBoss Rules更加Ҏ理解?br />

1.Rete Q?/span>

Rete 在拉丁语中是 ”net?/span> Q有|络的意思?/span> RETE 法可以分ؓ两部分:规则~译Q?/span> rule compilation Q和q行时执行( runtime execution Q?/span>

~译法描述了规则如何在 Production Memory 中生一个有效的辨别|络。用一个非技术性的词来_一个L别网l就是用来过滤数据。方法是通过数据在网l中的传播来qo数据。在端节点会有很多匹配的数据。当我们着|络向下赎ͼ匚w的数据将会越来越。在|络的最底部是终端节点( terminal nodes Q。在 Dr Forgy ?/span> 1982 q的论文中,他描qC 4 U基本节点: root , 1-input, 2-input and terminal ?/span>

根节Ҏ所有的对象q入|络的入口。然后,从根节点立即q入?/span> ObjectTypeNode ?/span> ObjectTypeNode 的作用是使引擎只做它需要做的事情。例如,我们有两个对象集Q?/span> Account ?/span> Order 。如果规则引擎需要对每个对象都进行一个周期的评估Q那会浪费很多的旉。ؓ了提高效率,引擎只让匹?/span> object type 的对象通过到达节点。通过q种ҎQ如果一个应?/span> assert 一个新?/span> account Q它不会?/span> Order 对象传递到节点中。很多现?/span> RETE 实现都有专门?/span> ObjectTypeNode 。在一些情况下Q?/span> ObjectTypeNode 被用散列法进一步优化?/span>

1-input 节点通常被称?/span> AlphaNode ?/span> AlphaNodes 被用来评估字面条Ӟ literal conditions Q。虽Ӟ 1982 q的论文只提C相等条gQ指的字面上相等Q,很多 RETE 实现支持其他的操作。例如, Account.name = = “Mark? 是一个字面条件。当一条规则对于一U?/span> object type 有多条的字面条gQ这些字面条件将被链接在一赗这是说Q如果一个应?/span> assert 一?/span> account 对象Q在它能到达下一?/span> AlphaNode 之前Q它必须先满第一个字面条件。在 Dr. Forgy 的论文中Q他?/span> IntraElement conditions 来表q。上一D|到的 ObjectTypeNode 是一U特D的 AlphaNode ?/span>

2-input 节点通常被称?/span> BetaNode ?/span> BetaNodes 被用来对 2 个对象进行对比。这两个对象可以是同U类型,也可以是不同cd。一?/span> BetaNode 的左边输入通常?/span> a list of objects 。右边输入是 a single object 。在一些情况下Q一个规则引擎可能实C?/span> BetaNodes 来处?/span> existential conditions ( ‘与’条?/span> ) ?/span> negated conditional element Q‘非’条Ӟ。很多现代的 RETE 实现通过 hash ?/span> b-tree indexes 来优?/span> BetaNodes ?/span>

Terminal nodes 被用来表明一条规则已l匹配了它的所有条Ӟ conditions Q。在一些情况下Q一条带有“或”条件的规则可以有超q一个的 terminal node 。从一?/span> RETE |络的观Ҏ看,一条带有“或”条件的规则实际上只?/span> 2 个拥有很多共享节点的节点?/span>

RETE 法的第二个部分是运行时Q?/span> runtime Q。当一个应?/span> assert 一个对象,引擎数据传递到 root node 。从那里Q它q入 ObjectTypeNode q沿着|络向下传播。当数据匚w一个节点的条gQ节点就它记录到相应的内存中。这样做的原因有以下几点Q主要的原因是可以带来更快的性能。虽然记住完全或部分匚w的对象需要内存,它提供了速度和可伸羃性的特点。当一条规则的所有条仉满Q这是完全匚w。而只有部分条件满I是部分匚w。(我觉得引擎在每个节点都有其对应的内存来储存满节点条g的对象,q就造成了如果一个对象是完全匚wQ那q个对象׃在每个节点的对应内存中都存有其映象。)

<!--[if !supportEmptyParas]-->

2.Leaps 法Q?/span>

Production systems ?/span> Leaps 法使用了一U?/span> lazy ”方法来评估条gQ?/span> conditions Q。一U?/span> Leaps 法的修改版本的实现Q作?/span> Drools v3 的一部分Q尝试结?/span> Leaps ?/span> RETE Ҏ的最好的特点来处?/span> Working Memory 中的 facts ?/span>

古典?/span> Leaps Ҏ所有的 asserted ?/span> facts Q按照其?/span> asserted ?/span> Working Memory 中的序Q?/span> FIFO Q,攑֜d栈中。它一个个的检?/span> facts Q通过q代匚w data type ?/span> facts 集合来找出每一个相兌则的匚w。当一个匹配的数据被发现时Q系l记住此时的q代位置以备待会的lP代,q且Ȁ发规则结果( consequence Q。当l果Q?/span> consequence Q执行完成以后,pȝ׃l箋处理处于d栈顶部的 fact 。如此反复?/span>

<!--[if !supportEmptyParas]--> 3.RuleBase:

一?/span> RuleBase 包含了多个将被用的规则包( packages of rules Q。当规则改变Ӟ一?/span> rulebase 被产生q且~存Q直到规则再ơ变化?/span>

一?/span> rulebase instance 是线E安全的Q所有你可以在你的应用中Q让一?/span> rulebase instance 在多个线E中׃n。对于一?/span> rulebase 的最通常的操作是产生一个新?/span> WorkingMemory ?/span>

q个 rulebase 保持着到它所产生?/span> WorkingMemoryd 的弱引用Q所以在长时间运行的 WorkingMemory 中,如果 rules 发生改变Q这?/span> WorkingMemory 可以即的根据最新的 rules q行更新Q而不必重?/span> WorkingMemory ?/span>

4.WorkingMemory:

WorkingMemory 基本上就是已l蝲入所有的 rules Qƈ且准备启动的 rule engine 。它保持了所有被 asserted q?/span> WorkingMemory 的数据的引用Q直到取消( retracted Q。ƈ且它是与你的pȝq行交互的地斏V?/span> WorkingMemory 是有状态对象。它们的生命周期可长可短。如果从一个短生命周期的角度来同一个引擎进行交互,意味着你可以?/span> RuleBase 对象来ؓ每个 session 产生一个新?/span> WorkingMemory Q然后在l束 session ?/span> discard q个 WorkingMemory Q生一?/span> WorkingMemory 是一个廉L操作Q。另一UŞ式,是在一个相当长的时间中Q例如一?/span> conversation Q,保持一?/span> WorkingMemory Qƈ且对于新?/span> facts 保持持箋的更新?/span>

4.1 Facts

Facts 是从你的应用中,?/span> assert q?/span> WorkingMemory 中的对象Q?/span> beans Q?/span> Facts 是规则可以访问的L?/span> java 对象。规则引擎中?/span> facts q不是?/span> clone ?/span> facts Q它只是持有C的应用中数据的引用?/span>

4.2 Assertion

“Assertion?/span> 是将 facts 告诉 WorkingMemory 的动作,例如 WorkingMemory.assertObject (yourObject) 。当?/span> assert 一?/span> fact 。它被查是否匹配规则。当你完?/span> assert facts 之后Q你q要调用?/span> fireAllRules() ”方法来启动匚w?/span>

Q?/span> WorkingMemory.assertObject(yourObjcet) 只是q行 assertion 的一U?/span> regular ҎQ还存在有一U称?/span> logical assertion 的动作)?/span>

4.3 Retraction

基本上就?/span> assert 的逆操作。当?/span> retract 一?/span> fact Q?/span> WorkingMemory 不再跟t那?/span> fact 。Q何依赖那?/span> fact ?/span> rules 不被激zR注意:完全有可能存在某条规则是依赖于一?/span> fact 的“不存在”( non existence Q。在q种情况下, retract 一?/span> fact 导致一条规则被ȀzR?/span>

4.4 Modification

规则引擎必须知道什么时候一?/span> fact 被改变了Q因Z赖此 fact ?/span> rule 会因此而被再次Ȁ发。当你修改一?/span> fact 的时候,告诉了规则引擎它的状态已l改变了?/span>

4.5 Globals

Globals 是一个能够被传进规则引擎的命名的对象。大多数q些对象被用来作为静态信息或服务。这些服务被用在一条规则的 RHS Q或者可能是从规则引擎返回对象的一U方法?/span>

4.6 Property Change Listener

如果你的 fact 对象?/span> java bean Q你可以为它们实C?/span> property change listener Q然后把它高数规则引擎。这意味着Q当一?/span> fact 改变Ӟ规则引擎会自动知道Qƈq行响应的动作?/span> Proxy libraries 会帮助实现q一切?/span>

4.7 Stateless and Statefull Sessions

Z RETE 法的规则引擎是有状态的规则引擎。有状态带来的好处是改变能够被通知和篏?/span> facts Q?/span> accumulating facts Q?/span>

管如此Q在很多情况下,所有提供给规则引擎的的 facts 都是最新的Q紧接着规则被激zR在q种情况下仅仅需要一U无状态的模式?/span>

JSR-94 API 指定了有状态和无状态的模式Q但是在 native API 中的{h物仅仅是创徏一个新?/span> WorkingMemory 实例Q然后当 session l束时删除它?/span>

<!--[if !supportEmptyParas]--> 

5. Agenda:

Agenda ?/span> RETE 的一个特炏V它是内存中的一个区域,在规则和匚w?/span> facts 被激发之前,它们被保存在q里Q称为?/span> activations ”?/span>

引擎工作在一个?/span> 2 阶段”模式下Q?/span>

<!--[if !supportLists]--> 1Q?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">  <!--[endif]--> WorkingMemory actions Q?/span>assert新的factsQ修改存在的facts?/span>retract facts都是WorkingMemory actions。这些动作从一条规则的RHS或是java code中被触发?/span>

<!--[if !supportLists]--> 2Q?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">  <!--[endif]--> Agenda evaluationQ?/span>rule actions在这里被Ȁ发)?/span>

注意Q这个过E是一个轮发生的q程Q一条规则的Ȁ发可能引?/span> WorkingMemory actions 的发生。当 WorkingMemory actions 发生Ӟ应该没有规则正在被激发?/span>

fireAllRules() Ҏ引v Agenda evaluation Q最l?/span> activations ”激发。这个过E一直重复直?/span> Agenda 被清I,此时控制权就回到应用E序中?/span>

5.1 Conflict Resultion

当有多条 rules ?/span> agenda 中,需要解军_H。当Ȁ发一条规则时Q会?/span> WorkingMemory 产生副作用。规则引擎需要知道规则要以什么顺序来Ȁ发(例如Q激?/span> rule A 可能会引?/span> rule B 被从 agenda 中移除。)

Drools 采取的冲H解决策略有 4 U,按照优先U排列如下: Salience Q?/span> FIFO Q先q先出)Q?/span> Total Recency ?/span> Load order ?/span>

优先U最高,也是最易懂的策略是?/span> Salience ”,即优先Q?/span> user 可以为某?/span> rule 指定一个高一点的优先U(通过附给它一个比较大的数字)。高 Salience ?/span> rule 会被优先激发?/span>

优先U最低的{略?/span> Load order Q就是按?/span> rule 被声明的序?/span>

5.2 Agenda Groups

Agenda Groups 是划?/span> Agenda ?/span> rules Q其实是?/span> activations ”)的一U方法。在L一个时刻,只有一?/span> group 拥有?/span> focus ”,q意味着只有在那?/span> group 中的 activations for rules 才是有效的?/span>

5.3 Filters

Filter ?/span> filter 接口的可选实玎ͼ用来允许或禁止一?/span> activation 能够被激发?/span>



junky 2006-06-02 00:24 发表评论
]]>
JBoss Rules 学习Q一Q? 什么是Rule http://www.tkk7.com/junky/archive/2006/06/02/49823.htmljunkyjunkyThu, 01 Jun 2006 16:23:00 GMThttp://www.tkk7.com/junky/archive/2006/06/02/49823.htmlhttp://www.tkk7.com/junky/comments/49823.htmlhttp://www.tkk7.com/junky/archive/2006/06/02/49823.html#Feedback0http://www.tkk7.com/junky/comments/commentRss/49823.htmlhttp://www.tkk7.com/junky/services/trackbacks/49823.html      学习JBoss Rules有几天了Q因斚w的中文资料较,所以这几天都在看官|上的manual。这是一份不错的教程Q我把我看的一些重要的东西译整理了一下,希望可以Ҏ学习JBoss Rules的同学们提供一点帮助?br />       在开始这份教E之前,我先要介l一下JBoss RulesQ?br />       JBoss Rules 的前w是Codehaus的一个开源项目叫Drools。最q被U_JBoss门下Q更名ؓJBoss RulesQ成ZJBoss应用服务器的规则引擎?br />       Drools是ؓJava量n定制的基于Charles  Forgy的RETE法的规则引擎的实现。具有了OO接口的RETE,使得商业规则有了更自然的表达?br /> 
       既然JBoss Rules是一个商业规则引擎,那我们就要先知道到底什么是RulesQ即规则。在JBoss Rules中,规则是如何被表示?br />

Rules

一条规则是对商业知识的~码。一条规则有 attributes Q一?/span> Left Hand Side Q?/span> LHS Q和一?/span> Right Hand Side Q?/span> RHS Q?/span> Drools 允许下列几种 attributes Q?/span> salience Q?/span> agenda-group Q?/span> no-loop Q?/span> auto-focus Q?/span> duration Q?/font> activation-group ?/span>

rule ?/span> < name > ”   ?br />     < attribute >   < value >     
    when        
        
< LHS >     
    then        
        
< RHS >
end

规则?/span> LHS ׃个或多个条gQ?/span> Conditions Q组成。当所有的条gQ?/span> Conditions Q都满qؓ真时Q?/span> RHS 被执行?/span> RHS 被称为结果( Consequence Q?/span> LHS ?/span> RHS cM于:
if  (  < LHS >  ) {
    
< RHS >
}

规则可以通过 package 关键字同一个命名空_ namespace Q相兌Q其他的规则引擎可能U此则集Q?/span> Rule Set Q。一?/span> package 声明?/span> imports Q?/span> global 变量Q?/span> functions ?/span> rules ?/span>


package  com.sample

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

global List cheeses

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

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

Ҏ的数据和被修改的数据q行规则的匹配称为模式匹配( Pattern Matching Q。进行匹配的引擎UCؓ推理机( Inference Engine Q。被讉K的规则称?/span> ProductionMemory Q被推理行匹配的数据UCؓ WorkingMemory ?/span> Agenda 理被匹配规则的执行。推理机所采用的模式匹配算法有下列几种Q?/span> Linear Q?/span> RETE Q?/span> Treat Q?/span> Leaps ?/span>

Drools 采用?/span> RETE ?/span> Leaps 的实现?/span> Drools ?/span> RETE 实现被称?/span> ReteOO Q表C?/span> Drools ?/span> Rete 法q行了加强和优化的实现?/span>



一条规则的 LHS ?/span> Conditional Element 和域U束Q?/span> Field Constraints Q。下面的例子昄了对一?/span> Cheese Fact 使用了字面域U束Q?/span> Literal Field Constraint Q?/span>

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

上面的这个例子类gQ?/span>

public   void  cheddarCheese(Cheese cheese) {
    
if  ( cheese.getType().equals( " cheddar " ) {
        System.out.println( 
" cheddar "  );
    }
}
<!--[if !vml]--> <!--[endif]-->

规则引擎实现了数据同逻辑的完全解耦。规则ƈ不能被直接调用,因ؓ它们不是Ҏ或函敎ͼ规则的激发是?/span> WorkingMemory 中数据变化的响应。结果( Consequence Q即 RHS Q作?/span> LHS events 完全匚w?/span> Listener ?/span>

?/span> rules 被加?/span> Productioin Memory 后, rules 被规则引擎用 RETE 法分解成一个图Q?/span>



?/span> Facts ?/span> assert q入 WorkingMemory 中后Q规则引擎找到匹配的 ObjectTypeNode Q然后将?/span> Fact 传播C一个节炏V?/span> ObjectTypeNode 拥有一块内存来保存所有匹配的 facts 。在我们的例子中Q下一个节Ҏ一个域U束Q?/span> Field Constraint Q, type = = “cheddar?/span> 。如果某?/span> Cheese 对象的类型不是?/span> cheddar ”,q个 fact 不会被传播到网l的下一个节炏V如果是?/span> cheddar ”类型,它将被记录到 AlphaNode 的内存中Qƈ传播到网l的下一个节炏V?/span> AlphaNode 是古?/span> RETE 术语Q它是一个单输入 / 单输出的节点。最后通过 AlphaNode ?/span> fact 被传播到 Terminal Node ?/span> Terminal Node 是最l节点,到此我们说这条规则被完全匚wQƈ准备Ȁ发?/span>

当一条规则被完全匚wQ它q没有立刻被Ȁ发(?/span> RETE 中是q样Q但?/span> Leaps 中它会立刻被Ȁ发)。这条规则和与其匚w?/span> facts 激z被攑օ Agenda Q由 Agenda 来负责安排激?/span> Activations Q指的是 rule + the matched facts Q?/span>

下面的图很清楚的说明?/span> Drools 规则引擎的执行过E:


数据?/span> assert q?/span> WorkingMemory 后,?/span> RuleBase 中的 rule q行匚wQ确切的说应该是 rule ?/span> LHS Q,如果匚w成功q条 rule q同和它匚w的数据(此时叫?/span> Activation Q一赯攑օ Agenda Q等?/span> Agenda 来负责安排激?/span> Activation Q其实就是执?/span> rule ?/span> RHS Q,上图中的菱Ş部分是?/span> Agenda 中来执行的, Agenda ׃Ҏ冲突解决{略来安?/span> Activation 的执行顺序?/span>



junky 2006-06-02 00:23 发表评论
]]>
վ֩ģ壺 ޾ƷĻѶ| þþƷѲ| þô| þ޸ۺ| ػɫĴƬۿƵ | Ƶվ߹ۿ| ˳˵Ӱ| ҹAVƬ| һëƬѲ| 18վڵ| ޸Ӱ߹ۿ| CAOPORNƷƵ| ľþþƷww16| պƷרվ| ĻӰѹۿ| ߳ѿƬ| ߹ۿһ | þAV뾫Ʒɫҹ鶹| 2015պƵ| ˾Ʒձֱ| ҹѸ߹ۿ| ѹۿ| 18Ƶѹۿ| ŮƵ.ַ | ƬAëƬ鴤ɫ| ĻþþƷ| Ѻܻƺɫ߹ۿ| aëƬ˾þ| ¶ѿ| 12345Ƶ| ݺݺݰƵ| 777޾Ʒþþþþ | ޾Ʒ岻| պƷרѲ| լ߹ۿ޲| ŷ޾Ʒ99ëƬѸۿ| ޾ƷVAƬ߲| պձ| ѾƷԲ߹ۿͼƬ| ù͵v͵v| Ƶ97|