`
hxpwork
  • 浏览: 111335 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Drools4:对Shopping示例的分析

阅读更多
  1. /*  
  2.     Shopping:为订单内商品总金额大于100元的订单给与10%的折扣  
  3.  
  4.     本例要点:  
  5.     1、语言Mvel和Java的切换  
  6.         在Package级别定义的是Mvel语言,而在"Apply..."规则中定义的是Java语言;  
  7.         两种语言的细节区别有很多,这里不详细说明。简单的说$c.name是Mvel语法,而$c.getName()则是Java语法  
  8.       
  9.     2、使用了not这样的非存在性逻辑,留意"Discount..."这两个规则  
  10.           
  11.     3、使用了from accumulate这种语法,accumulate的用法在手册中有详细说明  
  12.       
  13.     4、使用了insertLogical方法  
  14.         这里留意的是"Apply..."规则插入了Discount对象,但是在代码和规则中都没有显式的删除Discount操作,  
  15.         那"Discount removed notification"规则为何可以激活呢?  
  16.         原因就在于insertLogical和session.retract( hatPurchaseHandle );这行代码的调用  
  17.         retract删除的对象导致"Apply..."规则激活的条件变为无效,而Discount因为是insertLogical方法加入,  
  18.         在这种情况下自动被删除,导致了"Discount removed notification"规则激活  
  19.           
  20.     思考:  
  21.     1、为何在执行时"Apply..."规则先于"Discount removed notification"规则调用?  
  22.         我们知道,Drools规则引擎对规则执行冲突的解决方案如下:  
  23.         a) salience,拥有更高值的规则先激发  
  24.         b) LIFO:后进先出,这里所谓的先后是指根据Fact对象的插入顺序引发规则来计数的,越晚插入的Fact引起的规则越早执行  
  25.         c) 当LIFO顺序值相等时在Drl文件后面的规则先激发,这在Fibonacci例子中已经说明  
  26.           
  27.         现在回过头来看一下"Apply..."规则和"Discount removed..."规则,  
  28.         激活"Apply..."规则的是最后的Purchase对象插入,因此按照LIFO原则"Apply..."规则先激发  
  29.         假设你定义一个测试类TestRete,并在"Discount removed..."规则的条件中增加TestRete(),  
  30.         你会发现当你将TestRete放在Purchase之后插入时,"Discount removed..."规则会先激发,这进一步验证了LIFO原则。  
  31.  
  32. */  

Fact 插入

  1. Customer mark = new Customer( "mark",   
  2.                               0 );   
  3. session.insert( mark );   
  4.   
  5. Product shoes = new Product( "shoes",   
  6.                              60 );   
  7. session.insert( shoes );   
  8.   
  9. Product hat = new Product( "hat",   
  10.                            60 );   
  11. session.insert( hat );   
  12.   
  13. session.insert( new Purchase( mark,   
  14.                               shoes ) );   
  15. FactHandle hatPurchaseHandle = session.insert( new Purchase( mark,   
  16.                                                              hat ) );   
  17.   
  18. session.fireAllRules();   
  19.   
  20. session.retract( hatPurchaseHandle );   
  21. System.out.println( "Customer mark has returned the hat" );   
  22. session.fireAllRules();   

规则

  1. package org.drools.examples   
  2.   
  3. # 定义Package中使用mvel,默认是使用java   
  4. dialect "mvel"  
  5.   
  6. # 列出客户购买商品的情况   
  7. rule "Purchase notification"  
  8.     salience 10  
  9.   
  10.     when   
  11.         $c : Customer()   
  12.         $p : Purchase( customer == $c)         
  13.     then   
  14.         System.out.println( "Customer " + $c.name + " just purchased " + $p.product.name );   
  15. end     
  16.   
  17. # 当给与客户折扣时显示相关信息   
  18. rule "Discount awarded notification"  
  19.     when   
  20.         $c : Customer()   
  21.         $d : Discount( customer == $c )   
  22.     then   
  23.         System.out.println( "Customer " + $c.name + " now has a discount of " + $d.amount );   
  24. end   
  25.   
  26. # 当折扣取消时显示相关信息   
  27. rule "Discount removed notification"  
  28.     when   
  29.         $c : Customer()   
  30.         not Discount( customer == $c )   
  31.     then   
  32.         $c.setDiscount( 0 );   
  33.         System.out.println( "Customers " + $c.name + " now has a discount of " + $c.discount );   
  34. end   
  35.   
  36. # 如果客户购买的商品超过100元给与折扣   
  37. rule "Apply 10% discount if total purcahses is over 100"               
  38.     no-loop true       
  39.     dialect "java"  
  40.     when   
  41.         $c : Customer()   
  42.         $i : Double(doubleValue  > 100) from accumulate ( Purchase( customer == $c, $price : product.price ),    
  43.                                                                     sum( $price ) )   
  44.     then   
  45.         $c.setDiscount( 10 );   
  46.         insertLogical( new Discount($c, 10) );     
  47.         System.out.println( "Customer " + $c.getName() + " now has a shopping total of " + $i );   
  48. end   
分享到:
评论
1 楼 john_summer 2008-05-08  
发现一个问题,我分析了很久也没有结果,麻烦各位大虾帮想想
如果把两个Product的价格都改为160,在retract之后,居然也激活了"Discount removed notification"了这个规则,但是此时"Apply 10% discount if total purcahses is over 100"的条件依然是满足的呀,insertLogical进去的Discout对象不应该被删除的呀,很是奇怪,麻烦各位帮解答一下,谢谢了

相关推荐

    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 是一个强大的业务规则管理系统,它允许开发者通过声明式的方式定义...

    Drools4 insurance例子

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

    hellodrools:Drools 示例项目

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

    Drools4.x实例

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

    Drools

    在压缩包"drools-2.0"中,可能包含了Drools 2.0版本的库文件、文档、示例代码和API参考,这些都是学习和使用Drools的基础资源。通过研究这些内容,开发者可以深入了解Drools的工作原理,掌握如何在Java项目中集成和...

Global site tag (gtag.js) - Google Analytics