Drools 简介

article/2025/10/1 10:06:39

现实生活中,规则无处不在。对于某些企业级应用,诸如欺诈检测软件,购物车,活动监视器,信用和保密应用之类的系统,经常会有大量的、错综复杂的业务规则配置,而且随着企业管理者的决策变化,这些业务规则也会随之发生更改。我们开发人员不得不一直处理软件中的各种复杂问题,不仅需要将所有数据进行关联,还要尽可能快地一次性处理更多的数据,甚至还需要以快速的方式更新相关机制。

规则是什么?

​我们的日常生活是由规则驱动的。每次我们在开车的时候停在红灯处,之所以这样做,因为我们遵循一条规则,灯变红时我们应该停下来。如果你跳起来,最终会落到地面,这是由地球引力所决定的,它可以被表示成简单的数学方程。然而,对于我们生活日常中的规则,我们使用更加简单的结构来表示:当 XXX 的时候,做 XXX 的事。

这种结构对于组织复杂的业务逻辑非常适用。几乎所有复杂的业务场景都是由大量简单规则组成,它们共同提供了全面的复杂评估。整个评估过程开始于某一个简单的规则,然后不断地进行推导及冲突处理,最终得到一个评估结果。

不同的规则引擎的语法可能会有所不同,但基本都是如下这种经典结构,我们介绍的 Drools 也是如此。一旦某组数据满足条件匹配,则会用匹配到的数据执行某些特定的动作。

when 满足什么样的条件
then 最终结果

业务规则都是基于这种声明式的编程范例,而条件只是作为过滤器,只要数据被引入到符合条件的规则引擎,就可以确定需要执行的规则或规则组。这意味着流程的控制既不是由规则的编写顺序决定,也不是数据的输入顺序决定,而是由规则声明的条件确定的。

为什么需要使用规则?

在简单地了解过规则以后,你可能仍然对为什么使用规则而感到困惑。如果只是一个或几个逻辑判断,确实没有必要使用规则引擎,命令行语言可以更好地满足我们的需求。然而,业务规则往往是一个庞大且不断变化的规则组合,这使得系统非常复杂,如果只是使用常规代码,则会产生大量的维护工作。

随着业务规则的增长或应用场景的变化,需求会不断地变更,此时,我们可以通过调整规则而使其得到实现。主要是因为业务规则遵循以下原则:

  • 它们是独立的
  • 它们很容易更新
  • 每个规则控制所需的最小信息量
  • 它们允许不同背景的人进行合作

第一个 Drools 程序

学习一样新东西的最好的方法就是尝试使用它,下面编写一个简单的 Drools 应用程序。首先,我们需要创建一个 Maven 工程,然后在其 pom.xml 文件添加如下包依赖:

<dependencies><dependency><groupId>org.kie</groupId><artifactId>kie-api</artifactId><version>6.5.0.Final</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>6.5.0.Final</version><scope>runtime</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency>
</dependencies>

在 resources 目录下创建文件 helloworld.drl 文件,内容如下:

package helloworld;rule "HelloWorld"wheneval(true)thenSystem.out.println("HelloWorld");
end

在 resources/META-INF 目录下创建 kmodule.xml 文件,kmodule.xml 用来描述知识库资源的选择及知识库与会话的配置,内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule"><kbase name="helloWorldBase"><ksession name="helloWorldSession"/></kbase>
</kmodule>

创建单元测试类 HelloWorldTest,内容如下:

public class HelloWorldTest {@Testpublic void testHelloWorld() {KieServices kieServices = KieServices.Factory.get();KieContainer kieContainer = kieServices.newKieClasspathContainer();KieSession kieSession = kieContainer.newKieSession("helloWorldSession");kieSession.fireAllRules();kieSession.dispose();}
}

运行单元测试即可输出 HelloWorld 字样。

规则语法简介

现在我们已经执行了我们的第一条规则,是时候去了解一下规则语言了。我们先分析下我们之前写的规则,它的结构由条件和结果组成:

package 包名rule "规则名"
when(条件) - 也叫作规则的 LHS(Left Hand Side)
then(动作/结果) - 也叫作规则的 RHS(Right Hand Side)
end

每个 drl 都必须声明一个包名,这个包名与 Java 里面的不同,它不需要与文件夹的层次结构一致。规则名是规则的唯一标识,所以规则编写过程中需要保证它是不重复的。规则的条件(LHS)是按照 DRL 语言编写的,条件eval(true)表示永远为真,即该条规则总会获得执行。而规则的结果(RHS)使用 Java 语言实现,简单地输出了 HelloWorld 字样。

为了简单起见,这里不对 DRL 作完全的描述,更详细的语法请参考:http://docs.jboss.org/drools/release/6.5.0.Final/drools-docs/html_single/index.html#d0e4235

Drools 原理

DRL 解释执行流程
Drools 规则是在 Java 应用程序上运行的,其要执行的步骤顺序由代码确定。为了实现这一点,Drools 规则引擎将业务规则转换成执行树,如下图所示:
在这里插入图片描述
如上图所示,每个规则条件分为小块,在树结构中连接和重用。每次将数据添加到规则引擎中时,它将在与此类似的树中进行求值,并到达一个动作节点,在该节点处,它们将被标记为准备执行特定规则的数据。

规则引擎工作方式

Drools 规则引擎基于 ReteOO 算法(对面向对象系统的Rete算法进行了增强和优化的实现),它将事实(Fact)与规则进行匹配,以推断相应的规则结果,这个过程称之为模式匹配。

在这里插入图片描述

规则引擎默认不会在规则评估时立即执行业务规则,除非我们强制指定。当我们到达一个事实(Fact)与规则相匹配的节点时,规则评估会将规则操作与触发数据添加到一个叫作议程(Agenda)的组件中,如果同一个事实(Fact)与多个规则相匹配,就认为这些规则是冲突的,议程(Agenda)使用冲突解决策略(Conflict Resolution strategy)管理这些冲突规则的执行顺序。整个生命周期中,规则评估与规则执行之间有着明确的分割。规则操作的执行可能会导致事实(Fact)的更新,从而与其它规则相匹配,导致它们的触发,称之为前向链接。
在这里插入图片描述

应用场景

规则引擎虽然非常强大,但并非所有场景都适用。一般来说,规则引擎适用的项目都具有以下一个或多个特征:

  • 存在一个非常复杂的场景,即使对于商业专家也难以完全定义
  • 没有已知或定义明确的算法解决方案
  • 有不稳定需求,需要经常更新
  • 需要快速做出决策,通常是基于部分数据量

附录

Drools Jar 包介绍:

knowledge-api.jar - 提供接口和工厂。它清楚地描述用户 API 的职责,还有什么引擎 API。
knowledge-internal-api.jar - 提供内部接口和工厂。
drools-core.jar - 核心引擎,运行时组件。包含 RETE 引擎和 LEAPS 引擎。
drools-compiler.jar - 包含编译器/构建器组件,以获取规则源,并构建可执行规则库。
drools-decisiontables.jar - 决策表编译器组件,在 drools-compiler 组件中使用。支持 Excel 和 CSV 输入格式。
————————————————
版权声明:本文为CSDN博主「qchery」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chinrui/article/details/74906748

参考链接:http://docs.jboss.org/drools/release/6.5.0.Final/drools-docs/html_single/index.html

参考资料:《Mastering JBoss Drools 6 for Developers》

————————————————
版权声明:本文为CSDN博主「qchery」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chinrui/article/details/74906748


http://chatgpt.dhexx.cn/article/8m7qArVs.shtml

相关文章

drools 介绍

1 .场景 1.1需求 商城系统消费赠送积分 100元以下, 不加分 100元-500元 加100分 500元-1000元 加500分 1000元 以上 加1000分 ...... 1.2传统做法 1.2.1 if...else if (order.getAmout() < 100){ order.setScore(0); addScore(order); }else if(order.getAmo…

计组——定点数原码反码补码移码以及它们之间的转换

原码 用尾数表示真值的绝对值&#xff0c;符号位“0/1”对应“正/负” 若机器字长n1位&#xff0c;原码整数的表示范围&#xff1a; − ( 2 n − 1 ) ≤ x ≤ 2 n − 1 {\color{Red} -(2^{n}-1)\leq x\leq 2^{n}-1} −(2n−1)≤x≤2n−1&#xff08;关于原点对称&#xff09;…

数据的表示:原码、反码、补码、移码以及浮点数的运算

前言 复习到数据表示方面相关的知识&#xff0c;所以在这里做一下记录&#xff0c;也方便大家参考。 什么是 R 进制 对于 R 机制&#xff0c;如果要实现与十进制的转换&#xff0c;则使用 按权展开法&#xff0c;其具体操作为&#xff1a; 将 R 进制数的每一位数值用 R k R…

五分钟理解原码补码反码和移码

这是计算机的基本知识了&#xff0c;一定要好好学。哈哈废话不多说&#xff0c;直接进入正题吧。计算机中有无符号数和有符号数两大类。 有符号数就是正负数&#xff0c;在计算机中正好用0和1分别去代表正和负。(ps:好多人不理解机器数和真值&#xff0c;机器数就是把符号数字…

原码、反码、补码、移码的表示

若字长n为8时&#xff0c;那么45的二进制表示0 0101101 &#xff0c;若数值X 1.原码 [X]原&#xff0c;在二进制数值中&#xff0c;正数保持不变&#xff0c;负数符号位置1. 2.反码 [X]反&#xff0c;的正数保持不变 &#xff0c; 负数对数值的绝对值每一位按位求反 3.补码…

关于补码移码各自和原码的联系、来历、功能及I EEE754标准中移码范围问题

最近在学习计算机组成原理时,遇到一些问题,记录在此。 如果你对下面这段话有疑惑或者兴趣&#xff0c;我或许能说点什么你感兴趣的。 真值-128的补码&#xff1a;1000 0000&#xff0c;这个补码本身表示的二进制数&#xff08;无符号&#xff09;是128&#xff0c;其对应着真…

移码的计算方式

规则&#xff1a;对应真值的补码的符号位取反&#xff1b; 计算公式&#xff1a; 式中&#xff1a;x为真值&#xff0c;n为整数的位数&#xff1b; 形式上补码是先减后增的&#xff0c;移码是递增的&#xff1b;根据人类的习惯&#xff0c;移码可以清楚的反映对应真值的大小…

计算机组成原理学习笔记:定点数、浮点数、原码、反码、补码、移码

定点数与浮点数 所谓定点数就是指小数点的位置固定不变而浮点数是小数点的位置是不固定的&#xff0c;会浮动 1 ) 定点数 用熟悉的十进制数来类比&#xff0c;定点数就是我们平时更习惯使用的常规的计数方式&#xff0c;我们会显式的标明小数点的位置Eg: 110.12 2 &#xf…

原码,补码,移码

一、原码 ①最高位为符号位&#xff0c;0表示正数&#xff0c;1表示负数&#xff1b; ②除符号位其它数值部分&#xff0c;就是数值本身绝对值的二进制数&#xff1b; ③负数的原码是在其绝对值得的基础上&#xff0c;符号位变为1&#xff1b; 但是&#xff1a; 0的表示不唯一&…

移码补码原理

计算机中的“数”&#xff0c;花样很多&#xff0c;又是ASCII码、又是BCD码等等&#xff0c;下面&#xff0c;做而论道写了一些关于移码、补码的一些看法&#xff0c;欢迎拍砖。 机器数 计算机中的“数”&#xff0c;其实都不是数字&#xff0c;它们都是一些高、低电平。其中&a…

浮点数与移码

浮点数的组成和计数原理 浮点数是什么浮点数的表示与规定浮点数的规定&#xff08;IEEE754 标准&#xff09;浮点数的表示范围&#xff08;IEE7标准瞎&#xff09;阶码用移码表示 浮点数是什么 浮点数就是小数点可以任意浮动的数字。   因为在计算机的机器语言中&#xff0c;…

图神经网络时代的深度聚类

©PaperWeekly 原创 作者&#xff5c;纪厚业 学校&#xff5c;北京邮电大学博士生 研究方向&#xff5c;图神经网络和推荐系统 聚类作为经典的无监督学习算法在数据挖掘/机器学习的发展历史中留下了不可磨灭的印记。其中&#xff0c;经典的聚类算法 K-Means 也被选为数据挖…

聊聊测试工程师的核心能力模型

这是鼎叔的第二篇原创文章。 行业大牛和刚毕业的小白&#xff0c;都可以进来聊聊。 多年大厂技术总监和质量通道委员经验&#xff0c;横跨多个不同领域&#xff0c;微信公众号“敏捷测试转型”&#xff0c;欢迎多多交流。 鼎叔过往接触过各个团队的测试&#xff08;测试开发&…

对比学习有多火?文本聚类都被刷爆了…

文 | 花小花Posy 大家好&#xff0c;我是小花。 对比学习的大火???? 越来越旺了&#xff0c;已然从CV蔓延到NLP了。今天给大家介绍的正是一篇将对比学习应用到文本聚类上的工作&#xff0c;NAACL21新鲜出炉的paper——《Supporting Clustering with Contrastive Learning》…

(附源码)小程序 记账微信小程序 毕业设计 180815

记账微信小程序 摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;记账微信小程序被用户普遍使用&#xff0…

使用Python+OpenCV+Tensorflow实现图像聚类

介绍 大家好&#xff0c;最近在参加深度学习竞赛时&#xff0c;遇到了一个有趣的问题&#xff0c;即如何将给定的图像集进行聚类&#xff0c;你可能会说&#xff0c;这不是一个简单的分类问题吗&#xff1f;使用卷积神经网络&#xff0c; 就实现&#xff0c;但关键在于没有合适…

论文阅读笔记(15):Deep Subspace Clustering with Data Augmentation,深度子空间聚类+数据增强

论文阅读笔记&#xff08;15&#xff09;&#xff1a;Deep Subspace Clustering with Data Augmentation&#xff0c;深度子空间聚类数据增强 摘要1 介绍2 相关工作带增强的聚类方法具有一致性损失的自监督子空间聚类中的自表达模型 3 深度子空间聚类数据增强总结 4 寻找有效增…

【SaaS金羊毛】微信小程序We分析

微信前几天发布了通告https://mp.weixin.qq.com/cgi-bin/announce?actiongetannouncement&announce_id11652079103ziYFG&version&langzh_CN&token&#xff0c;小程序统计模块会升级为”We分析“这样一款独立的产品。实际上这也符合很多B端产品的趋势&#xff…

Python 如何确定K-Means聚类的簇数

背景 “人以类聚&#xff0c;物以群分”&#xff0c;在大千世界中总有那么一些人&#xff0c;性格爱好、行为习惯比较相近&#xff0c;我们就会把他们归为一类人&#xff0c;这就是我们人脑自动进行的一个聚类(归类)。 在数据分析中&#xff0c;我们也经常拿数据来进行K-Means聚…

【机器学习】聚类代码练习

本课程是中国大学慕课《机器学习》的“聚类”章节的课后代码。 课程地址&#xff1a; https://www.icourse163.org/course/WZU-1464096179 课程完整代码&#xff1a; https://github.com/fengdu78/WZU-machine-learning-course 代码修改并注释&#xff1a;黄海广&#xff0c;ha…