网站首页 > 博客文章 正文
Drools 引擎存储、处理和评估数据,以执行您定义的业务规则或决策模型。Drools 引擎的基本功能是将传入的数据或事实与规则的条件相匹配,并确定是否以及如何执行这些规则。
Drools 基本组件
Rules
定义的业务规则或 DMN 决策。所有规则必须至少包含触发规则的条件和规则指示的操作。
Facts
输入到 Drools 引擎或与 Drools 引擎匹配的 Drools 引擎中的数据会转换为规则条件,以执行适用的规则。
Production memory
规则存储在 Drools 引擎中的位置。
Working memory
Facts 存储在 Drools 引擎中的位置。
Agenda
已激活规则被注册和排序(如果适用)以准备执行的位置。
当业务用户或自动化系统在 Drools 中添加或更新与规则相关的信息时,这些信息将以一个或多个 Facts 的形式插入到 Drools 引擎的工作内存中。Drools 引擎将这些 Facts 与 Production memory 中的规则的条件进行匹配,以确定符合条件的规则执行(将事实与规则相匹配的过程)。
为什么使用 Drools 规则引擎
逻辑和数据分离
将域对象从业务规则中分离出来可以使应用程序的维护更加容易,因为它可以避免将来发生更改,因为逻辑都是在规则中列出的。
可伸缩性
Drools 使您的应用程序具有可伸缩性。如果发生任何频繁的更改请求,您可以轻松地添加新规则,而无需修改现有规则。
集中的知识库
规则引擎提供了一种集中化的知识,通过使用规则,您可以创建一个可执行的知识存储库,即知识库。这是商业策略的重点。理想情况下,规则非常具有可读性,它们也可以作为文档。 声明式编程
规则引擎使您可以定义“该做什么”而不是“如何执行此操作”。与代码不同,规则以不太复杂的语言编写,使任何业务分析师或新开发人员更容易理解和验证一组规则。使用规则,它们可以轻松地表达对复杂问题的解决方案并获得更好的解决方案。
什么是规则?
规则是常被表示为“当某些情况发生时,然后执行一些任务”的知识。规则引擎允许您定义“做什么”而不是“如何做”。
When
<Condition is true>
Then
<Take desired Action>
规则最重要的部分是其 When 部分。如果满足 When 部分,则触发 Then 部分。
rule <rule_name>
<attribute> <value>
when
<conditions>
then
<actions>
end
模式匹配
将新事实或现有事实与生产规则进行匹配的过程称为模式匹配,由推理引擎执行。有很多用于模式匹配的算法,包括 Linear、Rete、Treat、Lea。
Drools 实现并扩展了 Rete 算法,并表示针对面向对象系统的增强和优化的 Rete 算法实现,即 ReteOO 实现。
写规则
包
每个规则都以包名称开始。该包作为规则的命名空间。包中的规则名称必须是唯一的。规则中的包类似于 Java 中的包。
导入声明
无论您想要应用规则的任何事实,都需要导入这些事实。例如,com.fg.drools.domain.VipDiscountPrice 在上面的例子中。
规则定义
由规则名称、条件和结果组成。Drools 关键字是 rule、when、then 和 end。when 部分在规则中都是条件,then 部分是结果。在规则术语中,when 部分也称为 LHS(左侧),then 部分称为 RHS(右侧)。
规则语法
规则条件
规则可以包含许多条件和模式,如:
Account (balance == 200)
Customer (name == "Vivek")
以上条件检查帐户余额是否为 200 或客户名称为 Vivek。
规则中的变量
Drools 中的变量名以美元($)符号开头:
$account ? Account( )
$account is the variable for Account() class
Drools 可以与所有原生 Java 类型,甚至 Enum 一起工作。
全局变量
全局变量是分配给会话的变量:
- 对于输入参数(例如,可以从会话与会话自定义的常规值)
- 对于输出参数(例如,报告规则可以向全局报告变量写入一些消息)
- 日志等服务的入口点,可以在规则中使用
方法
function double calculateSquare (double value) {
return value * value;
}
规则结果关键字
规则结果关键字是规则 then 部分使用的关键字。
- 修改:事实的属性可以在规则的那些部分中修改。
- 插入:基于某些条件,如果为 true,则可以将新事实插入到规则引擎的当前会话中。
- 收缩:如果规则中的特定条件是真的,并且您不想在该事实上执行其他任何操作,则可以从规则引擎撤回特定事实。
项目实例
需求:会员购买商品优惠规则设置,不同等级的会员购买不同类型商品的优惠比例不同。
源码:cfjgithub/fgpublic
项目结构
实现方式一:通过 drl 规则文件。
实现方式二:通过 xls 文件配置规则。
pom 文件中加入的依赖:
<?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">
<parent>
<artifactId>com.fg.parent</artifactId>
<groupId>com.fg</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mydrools</artifactId>
<properties>
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
<http-component-version>4.4.6</http-component-version>
<drools-version>7.49.0.Final</drools-version>
<apache-poi-version>4.1.2</apache-poi-version>
<org.slf4j.version>2.0.0-alpha2</org.slf4j.version>
<logback.version>1.3.0-alpha5</logback.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>${drools-version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${drools-version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-mvel</artifactId>
<version>${drools-version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
<version>7.57.0.Beta1</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-ci</artifactId>
<version>${drools-version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
猜你喜欢
- 2024-12-30 IF嵌套层数太多?试试Drools规则引擎
- 2024-12-30 低代码开发重要工具:jvs-logic(逻辑引擎)基础原理与功能架构
- 2024-12-30 Java逻辑引擎服务编排,零代码低成本解决企业复杂业务需求
- 2024-12-30 JVS开源框架系列:多租户管理「含开源地址」
- 2024-12-30 开启灵活开发编码模式:规则引擎drools——基础语法
- 2024-12-30 Aviator规则引擎最佳实践 ilog规则引擎
- 2024-12-30 使用若依框架开发和部署简单应用的基本过程
- 2024-12-30 认识工作流程引擎 认识工作流程引擎教案
- 2024-12-30 开源规则引擎LiteFlow项目应用实践
- 2024-12-30 JAVA工作流「java工作流引擎框架」
你 发表评论:
欢迎- 最近发表
-
- 比GoPro 13更强的大疆Action 5 Pro,到底强在哪里?
- 信号和槽(信号和槽的实现原理)
- 在响应式项目中连接设计与开发(请简述实现响应式设计包括哪些技术点)
- 【C#】委托、Action、Func 和 Event 之间的关系
- 如何使用JavaScript实现Prompt弹窗?
- 谷歌Magic Actions功能曝光:AI革新安卓16通知交互
- 基于目标TPS的性能测试,如何通过手动设置场景进行测试?
- IOS基础学习之输出口和动作(io口输入输出实验总结及体会)
- 《Java语言程序设计》期末考试模拟试题——判断题和问答题
- Android学习之Touch事件的处理(android触摸事件实例)
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)