• Drools 入门案例——手把手教你


    Drools入门案例#

    业务场景说明#

    业务场景:消费者在图书商城购买图书,下单后需要在支付页面显示订单优惠后的价格。具体优惠规则如下:

    规则编号规则名称描述
    1 规则一 所购图书总价在100元以下的没有优惠
    2 规则二 所购图书总价在100到200元的优惠20元
    3 规则三 所购图书总价在200到300元的优惠50元
    4 规则四 所购图书总价在300元以上的优惠100元

    现在需要根据上面的规则计算优惠后的价格。

    开发实现#

    代码结构(我用的idea开发所以默认生成的可以pass掉,仅看src即可):

    DroolsTest>tree /f
     
    D:.
    │  pom.xml
    │
    ├─.idea
    │      .gitignore
    │      compiler.xml
    │      jarRepositories.xml
    │      misc.xml
    │      uiDesigner.xml
    │      workspace.xml
    │
    ├─src
    │  ├─main
    │  │  ├─java
    │  │  │  │  RulesHello.java
    │  │  │  │
    │  │  │  └─com
    │  │  │      └─bonelee
    │  │  │              Order.java
    │  │  │
    │  │  └─resources
    │  │      ├─META-INF
    │  │      │      kmodule.xml
    │  │      │
    │  │      └─rules
    │  │              bookDiscount.drl
    │  │
    │  └─test
    │      └─java
    └─target
        ├─classes
        │  │  RulesHello.class
        │  │
        │  ├─com
        │  │  └─bonelee
        │  │          Order.class
        │  │
        │  ├─META-INF
        │  │      kmodule.xml
        │  │
        │  └─rules
        │          bookDiscount.drl
        │
        └─generated-sources
            └─annotations
    

      

    第一步:创建maven工程drools_quickstart并导入drools相关maven坐标

        <dependencies>
            <dependency>
                <groupId>org.drools</groupId>
                <artifactId>drools-compiler</artifactId>
                <version>7.10.0.Final</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
        </dependencies>

    我自己的xml文件内容:
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.example</groupId>
        <artifactId>DroolsTest</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.drools</groupId>
                <artifactId>drools-compiler</artifactId>
                <version>7.10.0.Final</version>
            </dependency>
        </dependencies>
    
    </project>
    

      

     

    第二步:根据drools要求创建resources/META-INF/kmodule.xml配置文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <kmodule xmlns="http://www.drools.org/xsd/kmodule">
        <!--
            name:指定kbase的名称,可以任意,但是需要唯一
            packages:指定规则文件的目录,需要根据实际情况填写,否则无法加载到规则文件
            default:指定当前kbase是否为默认
        -->
        <kbase name="myKbase1" packages="rules" default="true">
            <!--
                name:指定ksession名称,可以任意,但是需要唯一
                default:指定当前session是否为默认
            -->
            <ksession name="ksession-rule" default="true"/>
        </kbase>
    </kmodule>
    

      

    注意:上面配置文件的名称和位置都是固定写法,不能更改

    第三步:创建实体类Order

    package com.bonelee;
    
    public class Order {
        private Double originalPrice;//订单原始价格,即优惠前价格
        private Double realPrice;//订单真实价格,即优惠后价格
        public String toString() {
            return "Order{" +
                    "originalPrice=" + originalPrice +
                    ", realPrice=" + realPrice +
                    '}';
        }
        public Double getOriginalPrice() {
            return originalPrice;
        }
        public void setOriginalPrice(Double originalPrice) {
            this.originalPrice = originalPrice;
        }
        public Double getRealPrice() {
            return realPrice;
        }
        public void setRealPrice(Double realPrice) {
            this.realPrice = realPrice;
        }
    }
    

      

    第四步:创建规则文件resources/rules/bookDiscount.drl

    package rules
    
    import com.bonelee.Order
    
    //规则一:所购图书总价在100元以下的没有优惠
    rule "book_discount_1"
        when
            $order:Order(originalPrice < 100)
        then
            $order.setRealPrice($order.getOriginalPrice());
            System.out.println("成功匹配到规则一:所购图书总价在100元以下的没有优惠");
    end
    
    //规则二:所购图书总价在100到200元的优惠20元
    rule "book_discount_2"
        when
            $order:Order(originalPrice < 200 && originalPrice >= 100)
        then
            $order.setRealPrice($order.getOriginalPrice() - 20);
            System.out.println("成功匹配到规则二:所购图书总价在100到200元的优惠20元");
    end
    
    //规则三:所购图书总价在200到300元的优惠50元
    rule "book_discount_3"
        when
            $order:Order(originalPrice <= 300 && originalPrice >= 200)
        then
            $order.setRealPrice($order.getOriginalPrice() - 50);
            System.out.println("成功匹配到规则三:所购图书总价在200到300元的优惠50元");
    end
    
    //规则四:所购图书总价在300元以上的优惠100元
    rule "book_discount_4"
        when
            $order:Order(originalPrice >= 300)
        then
            $order.setRealPrice($order.getOriginalPrice() - 100);
            System.out.println("成功匹配到规则四:所购图书总价在300元以上的优惠100元");
    end
    

      

    第五步:编写测试

    import org.kie.api.KieServices;
    import org.kie.api.runtime.KieContainer;
    import org.kie.api.runtime.KieSession;
    
    import com.bonelee.Order;
    
    public class RulesHello {
        public static void main(String[] args) {
            //获取kie容器对象
            KieServices kss = KieServices.Factory.get();
            KieContainer kieContainer = kss.newKieClasspathContainer();
            //从kie容器对象中获取session对象
            KieSession kieSession = kieContainer.newKieSession("ksession-rule");
    
            //Fact对象
            Order order = new Order();
            order.setOriginalPrice(240d);
            //插入Fact对象
            kieSession.insert(order);
    
            Order order2 = new Order();
            order2.setOriginalPrice(150d);
            kieSession.insert(order2);
    
            //激活规则,由Drools框架自动进行规则匹配,匹配成功,则执行当前规则
            int count = kieSession.fireAllRules();
            System.out.println("总执行了" + count + "条规则");
    
            //关闭会话
            kieSession.dispose();
    
            System.out.println(order.getRealPrice());
            System.out.println(order2.getRealPrice());
        }
    }
    

      运行结果:

    成功匹配到规则二:所购图书总价在100到200元的优惠20元
    成功匹配到规则三:所购图书总价在200到300元的优惠50元
    总执行了2条规则
    190.0
    130.0

  • 相关阅读:
    laravel 使用构造器进行增删改查
    explan各项说明
    data函数参数
    php引用
    PHP开发api接口安全验证方法一
    redis主从配置
    php 实现同一个账号同时只能一个人登录
    MySQL慢查询1- 开启慢查询
    前端基础 & 初识HTML
    HTTP协议概述
  • 原文地址:https://www.cnblogs.com/bonelee/p/16590944.html
Copyright © 2020-2023  润新知