Drools开源业务规则引擎(一)- 安装与介绍


文章目录

    • @[toc]
  • Drools开源业务规则引擎(一)- 安装与介绍
    • 0.何为规则引擎
    • 1.Drools介绍
      • 1.1.依赖模块
      • 1.2.规则引擎
    • 2.Drools安装
      • 2.1.依赖导入
      • 2.2.规则的输入和输出类型
        • 输入类型
        • 输出类型
      • 2.3.创建规则文件
      • 2.4.构建可执行规则库
      • 2.5.执行结果:
    • 3.Drools组件说明

Drools开源业务规则引擎(一)- 安装与介绍

0.何为规则引擎

规则引擎,是业务规则管理系统的一部分,主要思想是将应用程序中的业务决策部分分离出来,并使用预定义的语义模板编写业务决策(业务规则),由用户或开发者在需要时进行配置、管理。规则引擎通过业务规则管理系统(BRMS,Business Rule Management System)来实现对业务规则的集中管理和动态执行。

规则引擎的主要特点和好处:

  • 灵活性和可配置性:用户通过配置而不是代码编写来定义和管理业务规则。这使得规则可以根据需求进行更加灵活的调整和修改,而无需进行软件开发和发布。
  • 可维护性和可扩展性:业务规则的管理和维护变得更加容易。通过规则引擎,用户可以独立地修改、添加或删除规则,而无需修改应用程序的源代码。这提高了维护性和扩展性,同时降低了代码维护的风险和成本。
  • 业务与技术的分离:将业务规则从应用程序中分离出来,使得业务人员可以直接参与规则的定义和管理,而不需要依赖开发团队。这种分离促进了业务和技术之间的协作和沟通,加快了业务需求的落地。
  • 决策智能化:支持规则的动态执行和智能推断。可以根据事实和规则条件进行推理并做出相应的决策,业务处理过程更加智能化和自动化,并能够根据具体场景和条件进行个性化决策。
  • 可重复使用和标准化:规则可以被重复使用,并且以标准化的方式进行管理和执行。这样,不同的应用程序和系统可以共享相同的规则库,实现了规则的标准化和统一的执行。

目前市面上具体的规则引擎产品有:

  • Drools:Drools是一款开源的Java规则引擎,并且提供了强大的规则管理和执行功能。是业界广泛应用的规则引擎,具有丰富的功能和灵活的配置选项。
  • IBM Operational Decision Manager:ODM 是IBM提供的一套规则引擎和决策管理解决方案。具有强大的规则管理和执行能力,并且可以与其他IBM产品和技术进行集成。
  • PegaRULES Decision Management:Pegasystems推出的一款规则引擎产品,提供了全面的决策管理功能,包括规则的创建、维护、版本控制和执行。
  • Blaze Advisor:FICO(原Fair Isaac Corporation)推出的一款领先的规则引擎产品。具有高性能和可扩展的规则执行引擎,适用于大规模的决策管理和业务规则管理场景。
  • JBoss BRMS:红帽公司(Red Hat)提供的一套开源规则引擎和决策管理系统。基于Drools引擎,并提供了全面的规则管理和执行功能,支持多种商业规则管理需求。

1.Drools介绍

1.1.依赖模块

Drools 是一款开源的业务规则管理系统和规则引擎,由Jboss(现为红帽)开发和维护。Drools完全使用Java语言开发,基于Charles Forgy的RETE算法实现规则的高效执行。它提供了强大的规则管理和执行功能,能够帮助用户更好地管理和执行业务规则。

Drools被分解为几个模块,部分在规则开发/编译过程中需要,另一部分在运行时需要。在大多数情况下,项目只需要运行时包含的所有模块或者依赖,这种方式能提供更好的灵活性。所以运行时规则引擎的jar可以压缩到极致,只需要3个jar包(几百KB)。

以下是组成JBoss Drools的重要库的描述:

  • knowledge-api.jar :提供一组接口和类,有助于清楚地显示什么是用户API,什么是引擎API。

  • knowledge-internal-api.jar :提供了内部接口和工厂。

  • drools-core.jar : 核心引擎,运行时组件。包含RETE算法引擎和LEAPS前向推理算法引擎。如果你正在预编译规则(并通过Package或RuleBase对象进行部署),这是唯一的运行时依赖项。

    预编译规则(pre-compiling rules)指将规则在运行时之前进行编译的过程。通过预编译规则,可以提高规则引擎的执行效率。

  • drools-compiler.jar : 包含编译器/构建器组件,以获取规则源,并构建可执行规则库。这通常是应用程序的运行时依赖项,但如果你正在预编译规则,则不必依赖。这取决于drools-core。

  • drools-jsr94.jar : 这符合JSR-94的实现,这本质上是drools-compiler组件上的一个层。请注意,由于JSR-94规范的性质,并非所有功能都很容易通过此接口暴露。在某些情况下,直接访问Drools API会更容易,但在某些环境中,JSR-94是强制性的。

  • drools-decisiontables.jar : 这是决策表“编译器”组件,它使用drools-编译器组件。这支持excel和csv输入格式。

上述组件还需要相当多的其他依赖项,其中大多数用于drools-compiler、drools-jsr94或drools-decisiontables模块。

1.2.规则引擎

Drools引擎是Drools中的规则引擎。Drools引擎存储、处理和评估数据,以执行定义好的业务规则或决策模型。Drools引擎的基本功能是将传入的数据或事实与规则的条件相匹配,并确定是否以及如何执行规则。

rule engine inkscape enterprise

Drools引擎使用以下基本部件运行:

  • Rules:业务规则或DMN决策。所有规则都必须至少包含触发规则的条件以及规则规定的操作。(如上述案例的规则文件user.drl)
  • Facts:Drools引擎中匹配规则条件的输入数据。(如上述案例中的UserIn对象)
  • Production memory:Drools引擎中存储规则的位置。
  • Working memory:Drools引擎中存储事实的位置。
  • Agenda:已激活规则的注册和排序位置,为执行规则做准备。

2.Drools安装

2.1.依赖导入

        <dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>7.6.0.Final</version></dependency>

2.2.规则的输入和输出类型

输入类型
import lombok.Data;
import java.io.Serializable;/*** @Name: UserIn* @Description: 用户规则的输入对象* @Author: ahao* @Date: 2024/6/28 11:43 PM*/
@Data
public class UserIn implements Serializable {/*** 年龄:[0,100]*/private Integer age;}
输出类型
import lombok.Data;
import java.io.Serializable;/*** @Name: UserOut* @Description: 用户规则的输出对象* @Author: ahao* @Date: 2024/6/28 11:46 PM*/
@Data
public class UserOut implements Serializable {/*** 年龄阶段::0-6岁为婴幼儿;7-12岁为少儿;13-17岁为青少年;18-45岁为青壮年;46-69岁为中年;69岁以上为老年*/private String ageStages;}

2.3.创建规则文件

位置:classpath:drools/drl/user.drl

package drools.drl// 导入输入类型
import com.ahao.project.input.UserIn;
// 以全局变量的形式,定义输出类型
global com.ahao.project.output.UserOut output;//0-6岁为婴幼儿;
rule "age_0_6"
activation-group "age_stage"
enabled true
wheninput:com.ahao.project.input.UserIn(age >= 0 && age <= 6);
thenoutput.setAgeStages("婴幼儿");
end// 7-12岁为少儿;
rule "age_7_12"
activation-group "age_stage"
enabled true
wheninput:com.ahao.project.input.UserIn(age >= 7 && age <= 12);
thenoutput.setAgeStages("少儿");
end// 13-17岁为青少年;
rule "age_13_17"
activation-group "age_stage"
enabled true
wheninput:com.ahao.project.input.UserIn(age >= 13 && age <= 17);
thenoutput.setAgeStages("青少年");
end// 18-45岁为青壮年;
rule "age_18_45"
activation-group "age_stage"
enabled true
wheninput:com.ahao.project.input.UserIn(age >= 18 && age <= 45);
thenoutput.setAgeStages("青壮年");
end// 46-69岁为中年;69岁以上为老年
rule "age_46_69"
activation-group "age_stage"
enabled true
wheninput:com.ahao.project.input.UserIn(age >= 46 && age <= 69);
thenoutput.setAgeStages("中年");
end// 69岁以上为老年
rule "age_69_999"
activation-group "age_stage"
enabled true
wheninput:com.ahao.project.input.UserIn(age > 69);
thenoutput.setAgeStages("老年");
end

2.4.构建可执行规则库

    @Testpublic void userDrl() {// 获取规则文件String drl = "";try {File file = ResourceUtils.getFile("classpath:drools/drl/user.drl");FileReader fileReader = new FileReader(file);BufferedReader reader = new BufferedReader(fileReader);String s;while ((s = reader.readLine()) != null) {drl += s + "\n";}} catch (FileNotFoundException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}// 利用KieHelper工具类可以不通过kmodule.xml就可以实现规则KieHelper kieHelper = new KieHelper();// return new RuleBaseConfiguration();// RuleBaseConfiguration对象,可用于在决策引擎中配置异常处理程序设置、多线程执行和顺序模式。KieBaseConfiguration kieBaseConfiguration = kieHelper.ks.newKieBaseConfiguration();//  默认处理异常的类// kieBaseConfiguration.setOption(ConsequenceExceptionHandlerOption.get(DefaultConsequenceExceptionHandler.class));// 启用多线程: 默认不开启// kieBaseConfiguration.setOption(MultithreadEvaluationOption.NO);// 启用顺序模式: 默认不开启// Drools按照顺序执行规则一次,不会因为工作内存中的改变而再次执行规则。// 这就意味着Drools忽略了规则中的insert,modify和update语句,以单个序列执行规则。// 这个模式适合在无状态会话中使用。会让规则执行的更快kieBaseConfiguration.setOption(SequentialOption.YES);// ResourceType.DRL: 表示接受的规则文件类型kieHelper.addContent(drl, ResourceType.DRL);// 效验规则Results verify = kieHelper.verify();// 获取错误级别的编译日志if (verify.hasMessages( Message.Level.ERROR )) {log.error("规则编译失败:{}", messages);} else {KieBase kieBase = kieHelper.build(kieBaseConfiguration);// 创建无状态的会话StatelessKieSession statelessKieSession = kieBase.newStatelessKieSession();// 创建规则输出对象UserOut output = new UserOut();statelessKieSession.setGlobal("output", output);// 创建规则输入对象UserIn input = new UserIn();input.setAge(35);// 执行规则statelessKieSession.execute(input);log.info("执行规则完毕,年龄:{},结果:{}",input.getAge(),output.getAgeStages());}}

2.5.执行结果:

在这里插入图片描述

3.Drools组件说明

  • KieBase:Drools中的知识库,它包含了运行规则所需要的所有知识元素。知识元素包括规则(Rule)、事实(Fact)、函数(Function)、配置(KieBaseConfiguration)等。KieBase 是Drools中规则引擎的核心部分,它负责管理和执行规则。KieBase 是线程安全的,可以在多个 KieSession 中共享。
  • KieSession:Drools规则引擎中与应用程序交互的接口,是一个运行时的状态容器,包含了 Work Memory、Pattern Matcher , Conflict Resolver 和 Executor 等组件。它用于加载和激活规则,插入事实,并执行规则的匹配和执行过程。KieSession 可以通过 KieBase 创建,并能够进行查询和获取执行结果等操作。
  • KieModule:Drools规则引擎中对规则集合进行打包和部署的单位。包含了多个KieBase和KieSession的配置信息的容器,可以是一个jar文件或者一个文件夹。KieModule可以从本地或者远程的Maven仓库中加载,实现规则的动态更新和灵活部署。
  • KieFileSystem:Drools规则引擎中用于动态加载和管理规则资源文件的组件。一个虚拟的文件系统,用来存储规则文件和其他资源文件。它可以添加、修改和删除规则文件,并可以与KieServices和KieBuilder等组件一起使用,实现规则的灵活维护和更新。
  • KieContainer:管理KieModule的容器,可以从本地或者远程的Maven仓库中加载KieModule,并且可以动态地更新KieModule。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FreeRTOS的任务操作

文章目录 3 FreeRTOS任务操作3.1 创建task3.2 删除task3.2.1 空闲&#xff08;idle&#xff09;任务&#xff08;守护任务&#xff09;3.2.2 钩子&#xff08;Hook&#xff09;函数 3.3 设置&#xff0c;获取&#xff0c;task优先级3.3.1 设置任务优先级3.3.2 获取任务优先级 3…

自动驾驶---Motion Planning之多段五次多项式

1 前言 在之前的博客系列文章中和读者朋友们聊过Apollo的 Motion Planning方案: 《自动驾驶---Motion Planning之LaneChange》 《自动驾驶---Motion Planning之Path Boundary》 《自动驾驶---Motion Planning之Speed Boundary》 《自动驾驶---Motion Planning之轨迹Path优化》…

Oracle 上机

--1.&#xff08;3分&#xff09;查找每个部门的最高工资员工编号及其下属信息。 select e2.empno,e1.* from emp e1 join ( select * from emp where (deptno,sal) in (select deptno,max(sal) from emp group by deptno)) e2 on e1.mgr e2.empno; /* 2.&#xff08;5分&…

Spring Boot集成checkstyle快速入门Demo

1.什么是checkstyle&#xff1f; CheckStyle是一个帮助程序员来遵守一直的编码规范的工具。默认&#xff0c;它支持google 和sun 的java style guide。而且它是高度可配置的&#xff0c;允许自定义编码规范&#xff0c;并可以对各种IDE&#xff08;eclipse、Intellij&#xff…

昇思MindSpore学习笔记2-01 LLM原理和实践 --基于 MindSpore 实现 BERT 对话情绪识别

摘要&#xff1a; 通过识别BERT对话情绪状态的实例&#xff0c;展现在昇思MindSpore AI框架中大语言模型的原理和实际使用方法、步骤。 一、环境配置 %%capture captured_output # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspore版本&#xff0c;可更改下…

前端在for循环中使用Element-plus el-select中的@click.native动态传参

<el-table ref"table" :data"editTableVariables" cell-dblclick"handleRowDblClick" style"width: 100%" > <!-- el-table-column: 表格列组件&#xff0c;定义每列的展示内容和属性 --><el-table-column prop&q…

8种数据迁移工具

前言 最近有些小伙伴问我&#xff0c;ETL数据迁移工具该用哪些。 ETL(是Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程)&#xff0c;对于企业应用来说&#xff0c;我们经常会遇到各种数据的处理、转换、迁移的场景。 今天特地给大家汇总了一些目前…

【云原生】服务网格(Istio)如何简化微服务通信

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、微服务架构的兴起 2、Istio&#xff1a;服务网格的佼…

服务器测评

服务器测评 Linux测评口令是否存在空口令账户密码长度和密码定期更换密码复杂度本地登录失败处理功能相关参数超时锁定sshd服务相关端口是否已经打开不允许root账户远程登录查看SELinux状态审计查看Linux中正在运行的服务查看已添加的iptables规则查看文件和目录的权限设置是否…

大文件上传是怎么做的

1. 分片上传 1. 把需要上传的文件按照一定的规则&#xff0c;分割成相同大小的数据块 2. 初始化一个分片上传任务&#xff0c;返回本次分片上传的唯一标识 3. 按照一定的规则把各个数据块上传 4. 发送完成后&#xff0c;服务端会判断数据上传的完整性&#xff0c;如果完整&a…

【Python】Python环境搭建教学#保姆级教学#手把手带你安装——内附Python环境搭建安装包(Python、PyCharm(社区版)安装包)

Python环境搭建 导读一、初识Python1.1 Python的由来1.2 Python的用途1.3 Python的优缺点1.4 Python的前景&#xff08;钱景&#xff09; 二、Python环境搭建2.1 运行环境——Python安装2.2 开发环境——PyCharm安装2.3 项目创建2.4 基本配置2.4.1 主题配置2.4.2 背景图设置2.4…

Vue笔记-vue中使用JS创建的函数

主要是公司对前端要求不高&#xff0c;能解决问题就行了&#xff0c;前端不太熟&#xff0c;用js这种处理起来方便&#xff0c;在此记录下。 在src中创建一个api目录&#xff0c;新建custom.js export const getDivHeightByClass (className) > {let divElements docume…

容器之docker

Docker 是一个开源的平台&#xff0c;旨在使应用程序的开发、部署和运行更加轻松。它利用容器技术&#xff0c;将应用程序及其依赖环境打包在一起&#xff0c;以便于在任何环境中一致运行。 概述 Docker 通过提供轻量级的虚拟化解决方案&#xff0c;使得开发者可以轻松创建、…

.NET 调用API创建系统服务实现权限维持

01阅读须知 此文所节选自小报童《.NET 内网实战攻防》专栏&#xff0c;主要内容有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧&#xff0c;对内网和后渗透感兴趣的朋友们可以订阅该电子报刊&#xff0c;解锁更多的报刊内容。 02基本介绍 本文内容部分节选自小报童…

达梦数据库的DBMS_STATS包

达梦数据库的DBMS_STATS包 基础信息 OS版本&#xff1a; Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a; DM Database Server 64 V8 DB Version: 0x7000c 03134284132-20240115-215128-20081达梦数据库&#xff08;DM Database&#xff09;提供了 D…

FreeRTOS开发五、任务状态切换以及空闲任务回收结束的任务

1、任务状态切换 任务创建的时候就会处于就绪状态ready&#xff0c;然后他马上就能够运行进入Running状态&#xff0c;运行中可以调用vTaskDelay进入阻塞状态&#xff0c;实际就是延时一小段时间&#xff0c;等待唤醒&#xff0c;当延时时间过去后就回到了就绪状态&#xff0…

【python学习】自定义函数的一些高级用法-1

在 Python 中&#xff0c;自定义函数除了基本的定义和调用外&#xff0c;还有一些高级用法&#xff0c;可以让函数更加灵活和强大。以下是一些自定义函数的高级用法示例&#xff1a; 1. 默认参数 函数定义时可以指定默认参数值&#xff0c;当调用函数时没有提供该参数的值时&…

深入理解Spring Boot与Spring Cloud的整合方式

深入理解Spring Boot与Spring Cloud的整合方式 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨Spring Boot与Spring Cloud的整合方式&#x…

pytorch-ResNet18简单复现

目录 1. ResNet block2. ResNet18网络结构3. 完整代码3.1 网络代码3.2 训练代码 1. ResNet block ResNet block有两个convolution和一个short cut层&#xff0c;如下图&#xff1a; 代码&#xff1a; class ResBlk(nn.Module):def __init__(self, ch_in, ch_out, stride):su…