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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值