网站首页 > java教程 正文
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-10-25 Spring Boot 整合流程引擎 Flowable,so easy
- 2024-10-25 规则引擎重塑业务灵活性,但是你真的会用吗?
- 2024-10-25 Java表达式求值引擎Aviator(二)(java数学表达式解析)
- 2024-10-25 高德打车通用可编排订单状态机引擎设计
- 2024-10-25 NET RulesEngine(规则引擎)(规则引擎easy rule)
- 2024-10-25 25-规则引擎概述(使用规则引擎的优势)
- 2024-10-25 开启灵活开发编码模式:规则引擎drools——LHS部分
- 2024-10-25 21-规则引擎内容介绍(规则引擎使用案例场景)
- 2024-10-25 Aviator规则引擎最佳实践(规则引擎教程)
- 2024-10-25 开源规则引擎LiteFlow:为低代码开发带来革命性的变革
你 发表评论:
欢迎- 最近发表
-
- 五,网络安全IDA Pro反汇编工具初识及逆向工程解密实战
- 「JAVA8」- Lambda 表达式(java lambda表达式原理)
- 深入探讨Java代码保护:虚拟机保护技术的新时代
- Nginx反向代理原理详解(图文全面总结)
- 逆向拆解日本IT,哪些Java技术栈薪资溢价高
- mybatis 逆向工程使用姿势不对,把表清空了,心里慌的一比
- Spring Boot集成ProGuard轻松实现Java 代码混淆, Java 应用固若金汤
- 从 Java 代码逆向工程生成 UML 类图和序列图
- 人与人相处:尊重是标配,靠谱是高配,厚道是顶配
- Windows系统安装日期如何修改(windows10怎么修改安装日期)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)