广告
返回顶部
首页 > 资讯 > 精选 >drools入门案例分析
  • 892
分享到

drools入门案例分析

2023-06-30 14:06:32 892人浏览 安东尼
摘要

今天小编给大家分享一下drools入门案例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、背景最近在学习规则引擎dro

今天小编给大家分享一下drools入门案例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

一、背景

最近在学习规则引擎drools,此处简单记录一下drools的入门案例。

1.Drools介绍

drools是一款由JBoss组织提供的基于Java语言开发开源规则引擎,可以将复杂且多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件或特定的存储介质中(例如存放在数据库中),使得业务规则的变更不需要修改项目代码、重启服务器就可以在线上环境立即生效。

二、为什么要学习drools

假设我们存在如下场景:
在我们到商店购买衣服的时候,经常会发生这样的事情,购买1件不打折,购买2件打0.98折,购买3件级以上打0.85折。
那么我们在代码中如果要实现上述功能,是不是就需要编写if ... else语句,假设后期规则变了,是不是就需要修改这些if ... else语句,然后程序重新部署。这样是可以实现,但是不够优雅。那么我们是否可以将这些业务规则写入到规则文件中,以后规则变更直接修改规则文件即可?而drools就可以实现这个功能。

三、实现上方这个简单的打折案例

1、引入jar

<dependencyManagement>    <dependencies>        <dependency>            <groupId>org.drools</groupId>            <artifactId>drools-bom</artifactId>            <type>pom</type>            <version>7.69.0.Final</version>            <scope>import</scope>        </dependency>    </dependencies></dependencyManagement><dependencies>    <dependency>       <groupId>org.drools</groupId>        <artifactId>drools-compiler</artifactId>    </dependency>    <dependency>        <groupId>org.drools</groupId>        <artifactId>drools-mvel</artifactId>    </dependency>    <dependency>        <groupId>ch.qos.logback</groupId>        <artifactId>logback-classic</artifactId>        <version>1.2.11</version>    </dependency></dependencies>

2、编写kmodule.xml配置文件

此配置文件需要放置在resources/META-INF目录下。

<kmodule xmlns="Http://www.drools.org/xsd/kmodule">    <!--        kbase 可以存在多个        name: 指定kbase的名字,需要是唯一的        packages: 包名,可以理解为到src/main/resources目录下查找这个包名下的规则文件,多个包使用逗号分割        default: 当前kbase是否是默认的kbase    -->    <kbase name="shop-kabse" packages="com.huan.shop" default="false">        <!--            ksession 可以存在多个            name: 指定ksession 的名字,需要唯一            defalut: 当前ksession在这个kbase下是否是默认的            type: 指定当前ksession是否是有状态的 stateless表示是无状态的        -->        <ksession name="shop-ksession" default="false" type="stateless"/>        <ksession name="shop-ksession-stateful" default="false" type="stateful"/>    </kbase></kmodule>

此处我们需要关注一下 kbasepackage的值,这个值需要和规则文件中的package值一致,否则会找不到规则,具体看下方。

3、编写规则文件

1、规则文件的语法
包名,必须放置在第一行package// 引入Java中的类,需要些全限定名import// 定义function ,可选function  // Optional// 定义 query ,可选query  // Optionaldeclare   // Optionalglobal   // Optional// rule 关键字 "rule name" 规则的名字rule "rule name"    // Attributes 属性可选    when  // 关键字        // Conditions  条件,可为空    then        // Actions // 匹配后执行的结果end // 关键字
2、编写规则文件

规则文件的名字无所谓,比如: book-discount.drl

// 包名,必须防止到第一行,这个名字需要和 kbase中package属性的值一致package com.huan.shopimport com.huan.drools.CustomerOrder// 定义规则rule "shop-rule-01"    when        // 模式匹配:到工作内存中查找CustomerOrder,并且这个对象的purchaseQuantity值需要是1,        // 如果条件成立,$order是绑定变量名,一般以$开头,和fact对象区分开        $order:CustomerOrder(purchaseQuantity == 1)    then        System.out.println("匹配规则 shop-rule-01");        // 赋值,此处赋值后,在Java代码中获取获取到赋值后的值        $order.setDiscount(1D);endrule "shop-rule-02"    when        $order:CustomerOrder(purchaseQuantity == 2)    then        System.out.println("匹配规则 shop-rule-02");        $order.setDiscount(0.98);endrule "shop-rule-03"    when        $order:CustomerOrder(purchaseQuantity >= 3)    then        System.out.println("匹配规则 shop-rule-03");        $order.setDiscount(0.85);end
3、解释一下包名

drools入门案例分析

如果 shop-discount.drl的包名修改为com.huan.shop1则会提示如下警告:

01.589 [main] WARN org.drools.compiler.kie.builder.impl.KieBuilderImpl - File 'com/huan/shop/shop-discount.drl' is in folder 'com/huan/shop' but declares package 'com.huan.shop1'. It is advised to have a correspondance between package and folder names.

四、编写Java代码

1、编写一个订单对象

此对象保存的是用户购买了几件衣服和对应的折扣。

public class CustomerOrder {        private Integer purchaseQuantity;        private Double discount;    public CustomerOrder(Integer purchaseQuantity) {        this.purchaseQuantity = purchaseQuantity;    }}

2、编写测试代码

无状态测试方法statelessSessionTest规则规则2,即最终打0.98折。
2、有状态测试方法statefulSessionTest规则规则3,即最终打0.85折。

package com.huan.drools;import org.kie.api.KieServices;import org.kie.api.event.rule.DebugRuleRuntimeEventListener;import org.kie.api.runtime.KieContainer;import org.kie.api.runtime.KieSession;import org.kie.api.runtime.StatelessKieSession;public class DroolsApplication {    public static void main(String[] args) throws InterruptedException {        // 无状态session测试        statelessSessionTest();        // 有状态session测试        statefulSessionTest();    }    private static void statelessSessionTest() {        // 获取kie services        KieServices kieServices = KieServices.get();        // 获取kie容器对象        KieContainer kieContainer = kieServices.getKieClasspathContainer();        // 获取kie session , 此处获取的是无状态的session,因为 <ksession name="shop-ksession" default="false" type="stateless"/>        // 中type="stateless"就是无状态的session        StatelessKieSession kieSession = kieContainer.newStatelessKieSession("shop-ksession");        // 创建一个对象,可以理解为 Fact对象,即事实对象        CustomerOrder customerOrder = new CustomerOrder(2);        // 添加监听器,便于观察日志        kieSession.addEventListener(new DebugRuleRuntimeEventListener());        // 无状态的session只需要执行 execute 方法即可。        kieSession.execute(customerOrder);        System.err.println("通过规则后,获取到的折扣为:" + customerOrder.getDiscount());    }    private static void statefulSessionTest() {        // 获取kie services        KieServices kieServices = KieServices.get();        // 获取kie容器对象        KieContainer kieContainer = kieServices.getKieClasspathContainer();        // 获取kie session , 此处获取的是有状态的session        KieSession kieSession = kieContainer.newKieSession("shop-ksession-stateful");        // 创建一个对象,可以理解为 Fact对象,即事实对象        CustomerOrder customerOrder = new CustomerOrder(3);        // 添加监听器,便于观察日志        kieSession.addEventListener(new DebugRuleRuntimeEventListener());        // 将customerOrder对象加入到工作内存中        kieSession.insert(customerOrder);        // 触发所有的规则,如果只想触发指定的规则,则使用fireAllRules(AgendaFilter agendaFilter)方法        kieSession.fireAllRules();        // 有状态的session一定需要调用dispose方法        kieSession.dispose();        System.err.println("通过规则后,获取到的折扣为:" + customerOrder.getDiscount());    }}

此处需要注意有状态session无状态session写法的区别。

五、测试结果

drools入门案例分析

到此,我们使用drools实现的一个简单的案例就实现了。

六、drools引擎的基本组件

drools入门案例分析

Rules:我们自己定义的业务规则,比如我们自己写的规则文件。所有规则必须至少包含触发规则的条件和规则规定的操作。
2、Production memory:规则存储在 Drools 引擎中的位置。
3、Facts:输入或更改到 Drools 引擎中的数据,Drools 引擎匹配规则条件以执行适用规则。在规则中修改了Fact对象的值,真实的JavaBean的数据也会发生改变。
比如:当我们调用ksession.insert(对象),那么插入的这个对象就可以理解成Facts对象。
4、Working memory:facts 在 Drools 引擎中存储的位置。
5、Pattern matcher:匹配器,将Rule Base中所有的规则与Working memory中的Fact对象进行模式匹配,匹配成功的规则将被激活并放入到Agenda中。
6、Agenda:议程,执行Agenda中被激活的排好序的规则。

以上就是“drools入门案例分析”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: drools入门案例分析

本文链接: https://www.lsjlt.com/news/329526.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • drools入门案例分析
    今天小编给大家分享一下drools入门案例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、背景最近在学习规则引擎dro...
    99+
    2023-06-30
  • drools的简单入门案例场景分析
    目录一、背景1.Drools介绍二、为什么要学习drools三、实现上方这个简单的打折案例1、引入jar包2、编写kmodule.xml配置文件3、编写规则文件1、规则文件的语法2、...
    99+
    2022-11-13
  • Java注解入门案例代码分析
    这篇文章主要介绍“Java注解入门案例代码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java注解入门案例代码分析”文章能帮助大家解决问题。Talk is cheap, show me the...
    99+
    2023-07-05
  • Mybatis-Plus环境配置与入门案例分析
    目录1 初识Mybatis-Plus2 入门案例前期环境准备各层代码编写入门案例查询结果1 初识Mybatis-Plus   MyBatis-Plus简称 MP,是一个 MyBati...
    99+
    2022-11-13
  • HTML入门实例分析
    这篇文章主要介绍“HTML入门实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“HTML入门实例分析”文章能帮助大家解决问题。 HTML是英文Hyper Te...
    99+
    2022-10-19
  • SpringMVC入门实例分析
    今天小编给大家分享一下SpringMVC入门实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2022-10-19
  • Elasticsearch入门实例分析
    这篇文章主要介绍“Elasticsearch入门实例分析”,在日常操作中,相信很多人在Elasticsearch入门实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Elasticsearch入门实例分析...
    99+
    2023-06-05
  • MyBatis框架零基础快速入门案例分析
    这篇文章主要讲解了“MyBatis框架零基础快速入门案例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MyBatis框架零基础快速入门案例分析”吧!一、创建数据库和表数据库名ssm,数据...
    99+
    2023-06-29
  • flash away3D入门实例分析
    本文小编为大家详细介绍“flash away3D入门实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“flash away3D入门实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学...
    99+
    2022-10-19
  • CTF AWD入门实例分析
    这篇文章主要介绍了CTF AWD入门实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇CTF AWD入门实例分析文章都会有所收获,下面我们一起来看看吧。引文AWD赛制是一种网络安全竞赛的...
    99+
    2023-07-04
  • Python入门(案例)
    #一.上课案例: #输出hello wordprint('hello word') #python注释有两种#1.单行注释#这是单行注释#2.多行注释'''这是多行注释''' #python变量name='liuyong...
    99+
    2023-01-30
    入门 案例 Python
  • Docker入门安装实例分析
    本文小编为大家详细介绍“Docker入门安装实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Docker入门安装实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。do...
    99+
    2022-10-19
  • javascript入门实例代码分析
    这篇文章主要介绍“javascript入门实例代码分析”,在日常操作中,相信很多人在javascript入门实例代码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java...
    99+
    2022-10-19
  • 容器Docker入门实例分析
    这篇文章主要讲解了“容器Docker入门实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“容器Docker入门实例分析”吧!一、概述1.1 基本概念:d...
    99+
    2022-10-19
  • python入门代码实例分析
    这篇文章主要介绍“python入门代码实例分析”,在日常操作中,相信很多人在python入门代码实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python入门代码实例...
    99+
    2022-10-19
  • JUnit5基础入门实例分析
    这篇“JUnit5基础入门实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JUnit5基础入门实例分析”文章吧。设计哲...
    99+
    2023-06-17
  • Vue新手入门实例分析
    本篇内容介绍了“Vue新手入门实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! Vue实例和模板语法<body>...
    99+
    2023-06-27
  • Java入门数组实例分析
    今天小编给大家分享一下Java入门数组实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。认识数组数组的定义数组是相同类型...
    99+
    2023-06-30
  • Rollup入门实例代码分析
    这篇文章主要介绍了Rollup入门实例代码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Rollup入门实例代码分析文章都会有所收获,下面我们一起来看看吧。Rollup介绍及使用1、Rollup 概述仅仅是...
    99+
    2023-07-05
  • Blender Python编程入门实例分析
    Blender Python 编程支持的特性:编辑用户界面可以编辑的任何数据(场景,网格,粒子等)。修改用户首选项、键映射和主题。使用自己的设置运行工具。创建用户界面元素,如菜单、标题和面板。创建新的工具。创建交互式工具。创建与 Blend...
    99+
    2023-05-14
    Python blender
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作