首页 > 其他分享 >Drools 入门案例——手把手教你

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

时间:2023-05-31 10:35:05浏览次数:33  
标签:Drools 入门 手把手 order originalPrice 规则 100 所购 Order

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

 

标签:Drools,入门,手把手,order,originalPrice,规则,100,所购,Order
From: https://blog.51cto.com/u_11908275/6384734

相关文章

  • Nebula入门学习——day4 nGQL中的图查询和其他算法
    MATCH¶MATCH语句提供基于模式(pattern)匹配的搜索功能。一个MATCH语句定义了一个搜索模式,用该模式匹配存储在NebulaGraph中的数据,然后用RETURN子句检索数据。本文示例使用测试数据集basketballplayer进行演示。 我自己最喜欢用的是:(root@nebula)[basketballplayer]>MATCH(......
  • Nebula入门学习——day3 nGQL指南
    什么是nGQL¶nGQL(NebulaGraphQueryLanguage)是NebulaGraph使用的的声明式图查询语言,支持灵活高效的图模式,而且nGQL是为开发和运维人员设计的类SQL查询语言,易于学习。nGQL是一个进行中的项目,会持续发布新特性和优化,因此可能会出现语法和实际操作不一致的问题,如果遇到此......
  • nebula入门学习——day1 nebula基本概念、原理和架构
    什么是NebulaGraph¶NebulaGraph是一款开源的、分布式的、易扩展的原生图数据库,能够承载包含数千亿个点和数万亿条边的超大规模数据集,并且提供毫秒级查询。什么是图数据库¶图数据库是专门存储庞大的图形网络并从中检索信息的数据库。它可以将图中的数据高效存储为点(Vertex)和......
  • consul的入门实例
    Consul是一个开源的分布式服务发现和配置管理系统,由HashiCorp开发。它提供了服务注册与发现、健康检查、KV存储、多数据中心支持等功能,旨在简化分布式系统的构建和管理。Consul的入门实例主要涉及以下步骤:准备工作:安装Consul:根据您的操作系统,从Consul官方网站下载并安装Cons......
  • Solr的入门实例
    当涉及到Solr的入门实例时,以下是一个详细的示例,展示了如何设置Solr服务器并执行索引和查询操作。准备工作:安装Solr:请按照Solr官方文档中的说明安装并启动Solr服务器。创建集合:在Solr控制台上创建一个名为"my_collection"的集合。添加文档:创建一个名为"solr-demo"的Cor......
  • Eureka的入门实例
    当涉及到Eureka的入门实例时,以下是一个详细的示例,展示了如何设置Eureka服务器和注册服务。准备工作:添加依赖项:在您的Java项目中,添加以下依赖项以使用Eureka客户端和服务器:<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-st......
  • AI入门纯干货系列课程目录
    第一课、AI导论 (已更)第二课、机器学习导论(已更)第三课、特征工程(已更)第四课、KNN最近邻算法(已更)第五课、朴素贝叶斯算法(已更)第六课、决策树/随机森林第七课、常用机器学习算法性能对比第八课、SVD分解及PCA第九课、集成学习第十课、深度学习导论第十一课、计......
  • AntV L7 快速入门示例
    1.引言L7地理空间数据可视分析引擎是一种基于WebGL技术的地理空间数据可视化引擎,可以用于实现各种地理空间数据可视化应用。L7引擎支持多种数据源和数据格式,包括GeoJSON、CSV等,可以快速加载和渲染大规模地理空间数据。L7引擎还提供了丰富的可视化效果和交互功能,包括热力图......
  • Less从入门到精通
    目录Less从入门到精通Less预处理语言1.less安装和使用1.1学习目标1.2CSS的短板1.3预处理语言的诞生1.4less介绍1.5less的使用1.5.1注释1,5,2less变量1.6总结2.less变量2.1学习目标2.2选择器变量2.3属性变量2.4url变量2.5声明变量2.6变量运算2.7变量作用域2.8用变......
  • BOSS战-入门综合练习1
    这里将前面的内容综合起来了,会有点难,不过你可以问老师同学,也能上网查资料。P1478P1618P1579P2089......