`
cheng163134
  • 浏览: 33961 次
  • 性别: Icon_minigender_1
  • 来自: 湖北
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Drools4:对Ticket示例的分析

阅读更多

网站:JavaEye 作者:hxpwork 发表时间: 2007-08-04 14:19 此文章来自于 http://www.iteye.com
声明:本文系JavaEye网站原创文章,未经JavaEye网站或者作者本人书面许可,任何其他网站严禁擅自发表本文,否则必将追究法律责任!
原文链接: http://www.iteye.com/topic/108906





  1. /*  

  2.     Ticket示例是对客户电影票分配的处理  

  3.       

  4.     本例要点:  

  5.     1、使用了duration规则特性  

  6.       因为规则引擎的执行本身是在另外一个线程中进行的,  

  7.       因此使用了duration特性可以将指定的规则延迟一定时间运行  

  8.       但是要注意的是主线程中也需要做相应的延时,否则主线程结束后不会再处理子线程的结果  

  9.       

  10.     2、使用了Function函数  

  11.       

  12.     思考:  

  13.     1、原例子中使用不同的延迟时间决定规则的执行顺序,如果将所有"...Priority"规则的延时都设为相同会发生什么情况呢?  

  14.       首先将"Silver Priority","Gold Priority"的duration统一设为2000  

  15.       其次将源码中的t4.setStatus( "Done" );暂时注释,然后执行示例  

  16.       我们会发现在没有使用duration之前规则的执行顺序为DCBA,(指客户名,按照Ticket插入的LIFO顺序激发)  

  17.       而当使用duration之后,执行的顺序为ADCB,原来应当是最后执行的规则被调到最前面执行,而其它顺序不变;  

  18.       如果调换一下Ticket插入顺序,会发现这个规律同样存在  

  19.         

  20.     2、取消t4.setStatus( "Done" )注释(原版中是t3.setStatus,这里为了方便演示改为t4)又会发生什么呢?  

  21.       因为t4状态的改变会取消D规则,并激发一个新规则"Done"的执行。  

  22.       此时之前的DCBA执行顺序变为AXCB,  

  23.       如果调整Ticket插入顺序为CBAD,则执行顺序是CXBA,  

  24.       调整Ticket插入顺序为BADC,则执行顺序是CXBA  

  25.       

  26.       也就是说当D正好是duration之后将被第一个执行的规则时,因为setStatus原因被取消了  

  27.       此时其它规则的执行顺序不会被影响,否则将遵照第1点的情况。  

  28.        

  29.     从上面两个思考中我们可以得到Drools4.0规则对duration情况下执行顺序的潜在规则  

  30.     a) duration前应当最后执行的规则被放到了第一位执行,如果该规则在duration结束前被取消,其它规则顺序不会被影响。  

  31.     b) 在duration期间如果产生了新的规则,虽然它的优先顺序理论上要比duration之前的规则高(LIFO原则),  

  32.        但是也必须在完成了第一条duration之前的规则执行之后,才能插入后面的规则。  

  33.       

  34.     从设计的角度来说潜在规则b是可以理解的,但是潜在规则a就让人觉得迷惑,可能是编码上的一个小问题,在Drools4.0中是存在的,  

  35.     以后的版本可能会修正这个问题。  

  36.  

  37. */  



Fact 数据插入





  1.  // 建立客户以及贵宾卡等级   

  2.  final CustomerEx a = new CustomerEx( "A",   

  3.                                   "Gold" );   

  4.  final CustomerEx b = new CustomerEx( "B",   

  5.                                   "Platinum" );   

  6.  final CustomerEx c = new CustomerEx( "C",   

  7.                                   "Silver" );   

  8.  final CustomerEx d = new CustomerEx( "D",   

  9.                                   "Silver" );   

  10.  // 为客户分配电影票   

  11.  final Ticket t1 = new Ticket( a );   

  12.  final Ticket t2 = new Ticket( b );   

  13.  final Ticket t3 = new Ticket( c );   

  14.  final Ticket t4 = new Ticket( d );   

  15.  // 将客户数据插入WorkingMemory   

  16.  final FactHandle fa = session.insert( a );   

  17.  final FactHandle fb = session.insert( b );   

  18.  final FactHandle fc = session.insert( c );   

  19.  final FactHandle fd = session.insert( d );   

  20.  // 将电影票插入WorkingMemory   

  21.  final FactHandle ft1 = session.insert( t1 );   

  22.  final FactHandle ft2 = session.insert( t2 );   

  23.  final FactHandle ft3 = session.insert( t3 );   

  24.  final FactHandle ft4 = session.insert( t4 );   

  25.  // 激发规则   

  26.  session.fireAllRules();   

  27. // 中途修改电影票状态   

  28.  // 注意session.update并不会重新激发规则,   

  29.  // 只是因为规则引擎之前有延时,所以新的激活规则在引擎完成激发之前插入并执行   

  30.  // 如果在引擎完成激发之后update,不会有规则再被激发   

  31.  t4.setStatus( "Done" );   

  32.  session.update( ft4, t4 );   

  33.   

  34.  try {   

  35.     // 通过延时看出规则引擎是在单独的子线程中激发的,   

  36.     // 但是fireAllRules可以保证没有指定延时的规则在执行主线程的下一条语句前激发完毕   

  37.      System.err.println( "[[ Sleeping 5 seconds ]]" );   

  38.      Thread.sleep( 5000 );   

  39.  } catch ( final InterruptedException e ) {   

  40.      e.printStackTrace();   

  41.  }   

  42.   

  43.  System.err.println( "[[ awake ]]" );   

  44.   

  45.  session.dispose();   



规则





  1. # 显示增加的门票情况   

  2. rule "New Ticket"  

  3.     salience 10  

  4.     when   

  5.         customer : CustomerEx( )       

  6.         ticket : Ticket( customer == customer, status == "New" )       

  7.     then   

  8.         System.out.println( "New : " + ticket );           

  9. end   

  10.   

  11. # 找到银卡会员,设置电影票状态   

  12. rule "Silver Priority"  

  13.     duration 3000  

  14.     when   

  15.         customer : CustomerEx( subscription == "Silver" )      

  16.         ticket : Ticket( customer == customer, status == "New" )       

  17.     then   

  18.         ticket.setStatus( "Escalate" );   

  19.         update( ticket );          

  20. end   

  21.   

  22. # 找到白金卡会员,设置电影票状态   

  23. rule "Platinum Priority"  

  24.     when   

  25.         customer : CustomerEx( subscription == "Platinum" )    

  26.         ticket : Ticket( customer == customer, status == "New" )       

  27.     then;   

  28.         ticket.setStatus( "Escalate" );   

  29.         update( ticket );   

  30. end   

  31.   

  32. # 找到金卡会员,设置电影票状态   

  33. rule "Gold Priority"  

  34.     duration 1000  

  35.     when   

  36.         customer : CustomerEx( subscription == "Gold" )    

  37.         ticket : Ticket( customer == customer, status == "New" )       

  38.     then   

  39.         ticket.setStatus( "Escalate" );    

  40.         update( ticket );      

  41. end   

  42.   

  43. # 对于被设置状态为Escalate的电影票发送邮件   

  44. rule "Escalate"  

  45.     when   

  46.         customer : CustomerEx( )       

  47.         ticket : Ticket( customer == customer, status == "Escalate" )      

  48.     then   

  49.         sendEscalationEmail( customer, ticket );   

  50. end   

  51.   

  52. # 显示状态设置为Done的电影票情况   

  53. rule "Done"  

  54.     when   

  55.         customer : CustomerEx( )       

  56.         ticket : Ticket( customer == customer, status == "Done" )      

  57.     then   

  58.         System.out.println( "Done : " + ticket );          

  59. end   

  60.   

  61. # 模拟发送邮件的函数   

  62. function void sendEscalationEmail( CustomerEx customer, Ticket ticket ) {   

  63.     System.out.println( "Email : " + ticket );   

  64. }  





《 Drools4:对Ticket示例的分析 》 的评论也很精彩,欢迎您也添加评论。查看详细 >>

推荐相关文章:
  精品文章翻译:现实中的规则引擎
  使用 JProfiler 监控 JBoss 运行情况




JavaEye推荐
上海乐福狗信息技术有限公司:诚聘技术经理和开发工程师
免费下载IBM社区版软件--它基于开放的标准,支持广泛的开发类型,让您的开发高效自主!
京沪穗蓉四地免费注册,SOA技术高手汇聚交锋.
上海:优秀公司德比:高薪诚聘 资深Java工程师
广州:优易公司:诚聘Java工程师,开发经理
上海:尤恩斯国际集团:诚聘开发工程师
北京:优秀公司NHNChina招聘:WEB开发,系统管理,JAVA开发, DBA


分享到:
评论

相关推荐

    Drools报错:The Eclipse JDT Core jar is not in the classpath

    - janino-2.5.16.jar:这是一个轻量级的Java源代码编译器,Drools可能用它作为替代编译器,特别是在对Eclipse JDT Core有特殊需求或者无法使用的情况下。 - droolsjbpm-ide-common.jar:这个文件可能包含了Drools与...

    Drools4Demo 示例 非常不错

    通过研究和理解Drools4Demo中的各个示例,开发者可以快速掌握Drools的用法,并将其应用于自己的业务场景,实现高效、灵活的业务规则管理。此外,Drools4Demo还提供了详细的文档和注释,帮助开发者更好地理解和学习...

    drools的使用示例代码

    Drools是一款强大的规则引擎,它...通过分析和实践这个项目,开发者不仅可以掌握Drools的基本用法,还能了解如何在实际项目中灵活运用Drools,实现业务规则的动态管理。这将对提升企业的业务敏捷性和决策效率大有裨益。

    drools5.1 规则流示例

    本示例旨在演示如何在Drools 5.1中使用规则流(Rule Flow)进行复杂的业务流程管理。规则流是Drools提供的一种工具,它允许用户通过图形化方式定义规则执行的顺序和条件,从而更好地控制业务逻辑的执行流程。 首先...

    drools5 规则动态加载示例

    在这个"drools5 规则动态加载示例"中,我们将探讨如何在不重启服务的情况下,实现规则的热更新,即动态加载修改后的规则文件,使得业务逻辑能够实时适应变化。 在传统的软件开发中,一旦应用部署,若需更改业务规则...

    Drools入门-环境搭建,分析及示例.docx

    4. **Drools Fusion**:专为事件处理和时间推理而设计,它能够实时分析和响应来自不同源的事件,适用于实时决策系统。 5. **Drools Planner**:这是一个自动规划引擎,用于解决复杂的优化问题,如车辆路线规划、...

    drools代码示例包

    这个“drools代码示例包”提供了与CSDN博客文章《Drools实战:一个详尽的指南》相关的示例代码,帮助读者深入理解Drools的工作原理和使用方法。 在Drools中,主要涉及以下几个核心概念: 1. **规则**:规则是...

    drools drools drools drools drools

    4. drools-examples:这可能是一个包含drools使用示例的目录,帮助开发者理解如何在实际项目中应用drools,涵盖了各种规则的创建、加载和执行。 drools 使用DRL(Drools Rule Language)作为规则定义的语言,它支持...

    drools6学习例子

    这部分可能包括各种Drools规则的语法示例,如条件语句(IF-THEN)、逻辑运算符、函数调用、事实模式、积累函数、约束条件等。通过这些例子,你可以了解到如何编写规则来匹配特定的事实对象,并在满足条件时执行相应...

    Drools规则引擎实现原理及示例

    Drools规则引擎是一种嵌套在应用程序中的组件, 是用Java语言编写的开放源码规则引擎,使用Rete算法对所编写的规则求值。 它实现了将业务规则从程序代码忠分离出来,规则引擎使用特定的语法编写业务规则,规则引擎...

    Drools规则引擎实现示例

    4. **插入事实**:在示例中,可能会创建一个或多个`Customer`对象并将其插入到工作内存中,例如: ```java KieSession ksession = ...; // 初始化KieSession Customer customer = new Customer(); customer.set...

    drools-示例:Drools:规则引擎

    ** drools-examples-master 文件夹内容分析 ** `drools-examples-master` 压缩包很可能包含了 Drools 的示例项目,这些示例通常会演示如何创建、加载和执行规则,以及如何处理事实和规则结果。项目可能包括以下内容...

    Drools4Demo.rar

    在"压缩包子文件的文件名称列表"中,只提到了"Drools4Demo",这可能是整个示例项目的根目录。通常,这样的目录结构会包含以下部分: 1. **bin** 目录:可能包含可执行的Java程序或JAR文件,用于运行Drools示例。 2....

    drools7.5.0和spring 4.3.12集成示例

    在这个集成示例中,"drools7.5.0" 是 Drools 的一个特定版本,它包含了对规则定义、解析和执行的改进。"spring 4.3.12" 是 Spring 框架的一个稳定版本,提供了大量的增强和修复,包括对 Java 8 的全面支持。 集成...

    drools:流量MVN的实现示例

    标题 "drools:流量MVN的实现示例" 指涉的是使用 Drools 这一规则引擎来处理流量管理的场景,而该场景是通过 Maven(MVN)构建工具来实现的。Drools 是一个强大的业务规则管理系统,它允许开发者通过声明式的方式定义...

    drools使用的jar包

    drools使用的jar包,运行官方drools-distribution-7.7.0.Final drools使用的jar包,运行官方drools-distribution-7.7.0.Final drools使用的jar包,运行官方drools-distribution-7.7.0.Final drools使用的jar包,运行...

    Drools4 insurance例子

    【Drools4保险例子详解】 Drools4保险例子是一个基于Drools规则引擎的实战项目,展示了如何在J2EE环境下,特别是在使用JBoss应用服务器时,利用Drools进行业务规则管理。这个例子旨在帮助开发者理解如何将Drools...

    hellodrools:Drools 示例项目

    【标题】"hellodrools:Drools 示例项目"是一个基于Drools规则引擎的实践教程,旨在帮助开发者了解和掌握如何在Java应用程序中使用Drools进行业务规则的管理和执行。 【描述】"你好,Drools 示例项目"表明这是一个...

    Drools4.x实例

    7. 性能优化:在Drools4.x中,对性能进行了优化,包括更快的规则匹配和执行,以及更有效的内存管理。这使得Drools能够在处理大规模数据和复杂规则时仍然保持高效。 8. 社区支持:Drools拥有活跃的开发社区,提供了...

    drools7.25中文文档+drools技术指南.zip

    10. **案例研究与示例**:为了更好地理解和应用Drools,文档通常会包含多个实际的案例和示例,让你能够动手实践。 "Drools技术指南"可能会更深入地探讨上述某些主题,或者涵盖更高级的特性,如事件处理、规则流、...

Global site tag (gtag.js) - Google Analytics