RuoYi集成Drools,并实现数据库获取规则

Drools是一个开源的业务规则管理系统(BRMS)和规则引擎,它允许开发者以接近自然语言的形式定义业务规则,并将这些规则应用到应用程序中,实现业务逻辑的自动化和决策过程的优化。Drools基于Java语言开发,使用Rete算法来评估业务规则,并且支持声明方式表达业务逻辑。它允许使用非XML的本地语言编写规则,便于学习和理解,同时也可以嵌入Java代码到规则文件中,使得学习Drools更加吸引人。(简而言之:突然该业务了,不用修改源码,而是修改规则文件)

使用Drools需要了解KIE。Drools与KIE的关系可以这样理解:Drools是KIE生态中的一个关键组件,专注于业务规则的管理,而KIE提供了一个更广泛的平台,包括Drools在内的多个组件,以支持业务规则、流程、决策和规划等多种业务场景。 通过KIE,Drools和其他组件可以共享通用的API,如KieServices、KieContainer、KieSession等,这些API使得在不同的项目中使用这些组件变得更加一致和方便。 总的来说,Drools是KIE项目中的一个子集,而KIE提供了一个更大的框架来整合和管理Drools以及其他组件。(简而言之:Drools是KIE下的一个模块,为了KIE下模块更好的配合工作,KIE提供了统一组件来实现模块的使用和模块之间的调用,即KieServices、KieContainer、KieBase等组件。而此文章只单独使用Drools,不用调用其他模块)

Drools执行流程如下:

Drools流程


看代码:

 一、maven引入包:看情况挑选复制

//drools-core:这是Drools规则引擎的核心包,包含了Drools规则引擎的基本功能,如规则存储、规则执行等核心机制      
<dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>7.59.0.Final</version></dependency>//drools-compiler:这个包提供了对Drools规则文件(如DRL文件)的编译功能,将规则文件编译成可以在运行时执行的规则<dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>7.59.0.Final</version></dependency>
//drools-decisiontables:支持从Excel或CSV文件中加载规则,这些文件通常被称为决策表,它们提供了一种直观的方式来定义复杂的业务规则<dependency><groupId>org.drools</groupId><artifactId>drools-decisiontables</artifactId><version>7.59.0.Final</version></dependency>
//kie-api:提供了Kie工作流和规则引擎的API,它是基于Drools的Kie项目的一部分,用于构建更加复杂的业务逻辑和工作流<dependency><groupId>org.kie</groupId><artifactId>kie-api</artifactId><version>7.59.0.Final</version></dependency>//还有其他包:例如:drools-templates:提供了模板功能,允许用户使用模板来生成规则,这可以简化规则的创建和维护过程。
//drools-mvel:Drools所需的脚本语言包,MVEL(MVFLEX Expression Language)是一个动态的表达式语言,用于在Drools规则中编写更复杂的逻辑。

二:建立规则文件目录和kmodule.xml文件

1: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>

 关于kmoudle.xml文件,有内容需要学习:

在Drools规则引擎中,`KieBase` 和 `KieSession` 是两个核心概念,它们分别代表了知识库和知识会话,用于管理和执行业务规则。下面是它们各自的功能和用途:

### KieBase(知识库)
`KieBase` 是一个包含一组规则、流程、类和函数的容器。它相当于一个编译后的规则集合,其中包含了所有的业务逻辑和知识。`KieBase` 本身不包含任何运行时数据,它更像是一个静态的知识库,包含了所有的规则定义和相关的元数据。以下是 `KieBase` 的一些关键点:

1. **规则存储**:`KieBase` 存储了所有的规则定义,这些规则定义可以是DRL文件(Drools规则语言)或决策表。

2. **模块化**:`KieBase` 允许模块化设计,不同的 `KieBase` 可以包含不同的规则集合,这有助于大型项目的模块化和扩展。

3. **版本控制**:`KieBase` 可以包含多个版本的规则,这有助于管理规则的版本和变更。

4. **性能优化**:`KieBase` 可以被编译和优化,以提高规则执行的性能。

5. **多态性**:`KieBase` 支持多态性,允许在不同的上下文中使用相同的规则。

### KieSession(知识会话)
`KieSession` 是 `KieBase` 的一个实例,它包含了运行时的数据和状态。`KieSession` 用于执行 `KieBase` 中定义的规则。以下是 `KieSession` 的一些关键点:

1. **规则执行**:`KieSession` 用于执行 `KieBase` 中的规则。它接收事实(facts),并根据这些事实触发相应的规则。

2. **状态管理**:`KieSession` 管理着会话的状态,包括插入、修改和删除事实。

3. **事务管理**:`KieSession` 提供了事务管理功能,确保规则执行的一致性和完整性。

4. **类型安全**:`KieSession` 支持类型安全,可以确保只有正确的事实类型被插入到会话中。

5. **多种类型**:Drools 提供了不同类型的 `KieSession`,如 `StatefulKnowledgeSession` 和 `StatelessKnowledgeSession`。`StatefulKnowledgeSession` 保持状态,适用于需要长期运行的应用程序,而 `StatelessKnowledgeSession` 不保持状态,适用于一次性的规则评估。

6. **并发执行**:`KieSession` 支持并发执行,可以在多线程环境中使用。

7. **规则流**:在某些类型的 `KieSession` 中,如 `ProcessKieSession`,可以执行业务流程。

简而言之,`KieBase` 是规则和知识的静态存储,而 `KieSession` 是这些规则和知识的动态执行环境。通过 `KieBase` 和 `KieSession`,Drools 提供了一个强大的框架来定义、管理和执行复杂的业务规则。
 

2:规则文件

package rules
import com.drools.Order//规则一:所购图书总价在100元以下的没有优惠
rule "ninee"when$order:Order(originalPrice < 100)then$order.setRealPrice($order.getOriginalPrice());System.out.println("成功匹配到规则一:所购图书总价在100元以下的没有优惠");
end

//规则文件书写规范

package //规则文件包名

import  //java实体类

function  // Optional

query  // Optional

declare   // Optional

global   // Optional

rule "rule name"
    // Attributes
    when
        // Conditions 条件,若符合,则执行then里面的
    then
        // Actions 执行代码
end

rule "rule2 name"

......

三、具体的执行代码

1:创建实体类

import lombok.*;@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Order {private Double originalPrice; //初始价格private Double realPrice;//实际价格}

2:具体计算方法 

    KieServices kieServices = KieServices.Factory.get();KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();//会话对象,用于和规则引擎交互KieSession kieSession = kieClasspathContainer.newKieSession();//构造订单对象,设置原始价格,由规则引擎根据优惠规则计算优惠后的价格Order order = new Order();order.setOriginalPrice(210D);//将数据提供给规则引擎,规则引擎会根据提供的数据进行规则匹配kieSession.insert(order);//激活规则引擎,如果规则匹配成功则执行规则kieSession.fireAllRules();//关闭会话kieSession.dispose();System.out.println("优惠前原始价格:" + order.getOriginalPrice() +",优惠后价格:" + order.getRealPrice());

 四、执行代码结果


以上就能实现规则文件的读取和规则结果的计算。但是既然集成到了若依里面,最好将规则存储到数据库,所有规则从数据库读取,这样更方便通过网页维护,而非编写规则文件。

那么需要修改计算方法

   String myRule = "package rules\n" +"import com.s3.drools.Order\n" +"dialect  \"mvel\"\n" +"\n" +"rule \"ninee\"\n" +"    when\n" +"        $order:Order(originalPrice < 100)\n" +"    then\n" +"        $order.setRealPrice($order.getOriginalPrice());\n" +"        System.out.println(\"成功匹配到规则一:所购图书总价在100元以下的没有优惠\");\n" +"end\n";KieHelper helper = new KieHelper();helper.addContent(myRule, ResourceType.DRL);KieSession ksession = helper.build().newKieSession();Order ordera = new Order();ordera.setOriginalPrice(210D);//将数据提供给规则引擎,规则引擎会根据提供的数据进行规则匹配ksession.insert(ordera);ksession.fireAllRules();ksession.dispose();System.out.println("优惠前原始价格:" + ordera.getOriginalPrice() +",优惠后价格:" + ordera.getRealPrice());

以上 myrule即为规则,那么就可以存储到数据库了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/35817.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

什么是API接口?如何调用API接口?

一、什么是 API 接口 定义 API&#xff08;Application Programming Interface&#xff09;即应用程序编程接口。它是一组定义好的规则和协议&#xff0c;允许不同的软件应用程序之间进行通信和交互。可以把 API 想象成是餐厅的服务员&#xff0c;当顾客&#xff08;一个软件应…

BurpSuite-6(验证码识别)

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;burp(6)暴力破解与验证码识别绕过_哔哩哔哩_bilibili 一、下载 github地址&#xff1a;GitHub - f0ng/captcha-killer-modified: captcha-killer…

【JavaEE】多线程(7)

一、JUC的常见类 JUC→java.util.concurrent&#xff0c;放了和多线程相关的组件 1.1 Callable 接口 看以下从计算从1加到1000的代码&#xff1a; public class Demo {public static int sum;public static void main(String[] args) throws InterruptedException {Thread …

Go 程序编译的步骤

Go程序编译的步骤 词法分析&#xff08;Lexical Analysis&#xff09; Go编译器首先对源代码进行词法分析&#xff0c;将代码拆分成标记&#xff08;tokens&#xff09;&#xff0c;这些标记是编程语言的最小单位&#xff0c;如关键字、变量名、操作符等。 作用&#xff1a;生…

SD-WAN服务商应该怎么挑选?

随着企业对高效、灵活网络的需求不断增长&#xff0c;SD-WAN技术逐渐成为市场热点。然而&#xff0c;面对众多服务商的多样化方案&#xff0c;如何选择最适合自己企业的服务商是一个重要的问题。SD-WAN服务商之间在技术、功能和服务等方面存在差异&#xff0c;企业需要根据自身…

三相LCL并网逆变器--仿真验证

根据前面的博客的讲解&#xff0c;确定主电路参数如下 名称/单位 值 名称/单位 值 额定功率P/kW 20 开关频率fsw/kHz 10 母线电压Udc/V 720 逆变器侧电感L1/mH 1.8 额定电流Ireated/A 30 并网测电感L2/mH 0.4 PCC电压/Us/V 220 滤波电容C/uF 4.7 电网频率f…

基于SpringBoot+Vue的服装生产管理系统-无偿分享 (附源码+LW+调试)

目录 1. 项目技术 2. 功能菜单 3. 部分功能截图 4. 研究背景 5. 设计原则 6. 可行性分析 6.1 技术可行性 6.2 经济可行性 6.3 操作可行性 7. 系统设计 7.1 系统流程和逻辑 7.2 系统结构 8. 数据库设计 8.1 数据库ER图 &#xff08;1&#xff09;管理员实体属性图…

告别充电焦虑:移动充电机器人的革命性解决方案

移动充电机器人作为新能源汽车领域的黑科技&#xff0c;正逐渐崭露头角。它的出现为电动汽车充电带来了全新的解决方案&#xff0c;解决了传统充电方式的诸多痛点。 新能源汽车具有诸多优点&#xff0c;如科技含量高、噪音小、使用成本低等&#xff0c;但 “续航焦虑”“充电焦…

【启明智显分享】ESP32-P4方案4.3寸触摸屏来袭!支持MIPI CSI摄像头接口

家人们&#xff0c;你们一直在等的ESP32-P4方案4.3寸触摸屏它来了&#xff01; 启明智显全新推出的ESP32-P4 4.3寸IPS触摸屏&#xff0c;搭载强大的双核400MHz RISC-V处理器&#xff0c;配备32MB PSRAM和16MB FLASH&#xff0c;分辨率800*480&#xff0c;性能和视觉体验再次突…

国内管理咨询公司哪家落地辅导做的好?

在当今快速变化的市场环境中&#xff0c;企业面临着前所未有的竞争压力与转型挑战。为了在这场没有硝烟的战争中脱颖而出&#xff0c;许多企业开始寻求外部专业力量的帮助&#xff0c;以期通过科学的管理咨询实现战略升级和业绩突破。而在众多的管理咨询公司中&#xff0c;思博…

【力扣】824.山羊拉丁文

问题描述 思路解析 首先把字符串通过空格分隔开来&#xff0c;用一个字符串数组来接收。因为要经常加上字符&#xff0c;所以使用 StringBuilder &#xff0c;最后再进行转化然后检验首字母是否为元音&#xff0c;因为元音字母加上其大小写比较多&#xff0c;所以用一个字符串…

二叉树OJ题

带值的多层递归 对二叉树的递归性质做一个更好的补充。 提到二叉树的递归&#xff0c;我们首相想到的就是二叉树的深度优先遍历&#xff08;根遍历&#xff09;。对于求二叉树结点的个数&#xff0c;同样可以用递归来实现&#xff08;带值的多层递归&#xff09;。 1、二叉树的…

算法刷题Day11: BM33 二叉树的镜像

点击题目链接 思路 转换为子问题&#xff1a;左右子树相反转。遍历手法&#xff1a;后序遍历 代码 class Solution:def Transverse(self,root: TreeNode):if root None:return rootnewleft self.Transverse(root.left)newright self.Transverse(root.right)# 对root节点…

leetcode104.二叉树的最大深度

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;root [1,null,2] 输出…

一体式远程IO(三格电子)

一、功能概述 1.1 设备结构 本产品是三格电子研发生产的一体式远程 IO 。通信有 Profinet 、EtherCAT、 EtherNet/IP 三种。IO 接口有&#xff1a;32 路数字量输入、32 路数字量输出 NPN、32 路数字量输出 PNP、16 路数字量输入 16 路数字量输出 NPN、16 路数字量输入 16 路数…

零碳新墅居 | 重新定义零碳美学,阳光新能源打开高端品智生活新可能

当下人们对于居住生活的期待&#xff0c;不再仅限于实用与舒适&#xff0c;更追求绿色、低碳、美观与智能的结合。在这一趋势下&#xff0c;零碳墅居生活正成为引领高端生活风尚的新范式。 11月初&#xff0c;PChouse太平洋家居网携手阳光家庭能源官宣成立的“零碳新墅居设计智…

库存看板在现代企业管理中的作用:如何通过看板系统提升库存流动性与效率?

库存管理是现代企业管理中的重要环节&#xff0c;尤其对于制造业、零售业及电商平台等行业&#xff0c;如何高效、精准地管理库存&#xff0c;避免过度库存积压或库存不足的情况&#xff0c;直接影响到公司的运营成本、资金周转、客户满意度等多个方面。而在众多库存管理方法中…

免押租赁系统助力资源共享新模式开创便捷租赁体验

内容概要 免押租赁系统&#xff0c;听起来是不是很酷&#xff1f;这个新模式不仅仅是为了让你少花点钱&#xff0c;它的到来简直就是个革命&#xff01;以前&#xff0c;租东西时首先想到的就是那个令人心痛的押金&#xff0c;对吧&#xff1f;但现在&#xff0c;免押租赁系统…

Spring Boot 3 + Vue 3实战:实现用户登录功能

文章目录 一、实战概述二、实战步骤? &#xff08;一&#xff09;创建前端项目 - login-vue 1、创建Vue项目2、安装axios模块3、安装vue-router模块4、安装less和less-loader模块5、运行Vue项目6、在浏览器里访问首页7、在IDEA里打开Vue项目8、创建登录Vue组件9、创建首页Vue…

记录一次老平台改造通知用户刷新页面,纯前端实现

记录一次老平台改造通知用户刷新页面&#xff0c;纯前端实现 方案概述背景现状问题本质 方案设计前提设计实现 其他补充写在最后的话抛出一个问题 方案概述 背景 前端构建完上线&#xff0c;用户还停留还在老页面&#xff0c;用户不知道网页重新部署了&#xff0c;跳转页面的时…