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

news2024/11/16 15:34:38

文章目录

    • @[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
when
    input:com.ahao.project.input.UserIn(age >= 0 && age <= 6);
then
    output.setAgeStages("婴幼儿");
end

// 7-12岁为少儿;
rule "age_7_12"
activation-group "age_stage"
enabled true
when
    input:com.ahao.project.input.UserIn(age >= 7 && age <= 12);
then
    output.setAgeStages("少儿");
end

// 13-17岁为青少年;
rule "age_13_17"
activation-group "age_stage"
enabled true
when
    input:com.ahao.project.input.UserIn(age >= 13 && age <= 17);
then
    output.setAgeStages("青少年");
end

// 18-45岁为青壮年;
rule "age_18_45"
activation-group "age_stage"
enabled true
when
    input:com.ahao.project.input.UserIn(age >= 18 && age <= 45);
then
    output.setAgeStages("青壮年");
end

// 46-69岁为中年;69岁以上为老年
rule "age_46_69"
activation-group "age_stage"
enabled true
when
    input:com.ahao.project.input.UserIn(age >= 46 && age <= 69);
then
    output.setAgeStages("中年");
end

// 69岁以上为老年
rule "age_69_999"
activation-group "age_stage"
enabled true
when
    input:com.ahao.project.input.UserIn(age > 69);
then
    output.setAgeStages("老年");
end

2.4.构建可执行规则库

    @Test
    public 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.coloradmin.cn/o/1884886.html

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

相关文章

CesiumJS【Basic】- #040 绘制渐变线(Primitive方式)

文章目录 绘制渐变线(Primitive方式)1 目标2 代码2.1 main.ts绘制渐变线(Primitive方式) 1 目标 使用Primitive方式绘制渐变线 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer

【ubuntu18.04】 局域网唤醒 wakeonlan

ai服务器经常因为断电,无法重启,当然可以设置bios 来电启动。 这里使用局域网唤醒配置。 自动开关机设置 工具:ethtool 端口 : enp4s0 Wake-on: d 表示禁用Wake-on: g 激活 ,例如:ethtool -s eth0 wol g 配置/etc/rc.local ,这个文件不存在,自己创建工具下载 tengxun W…

机器学习项目-基于随机森林的航空公司用户满意度分析

摘要 ​ 航空旅行是人们出行的常用方式之一&#xff0c;乘客对于航空公司的服务质量有着较高的要求。满意度是衡量服务质量的重要指标&#xff0c;因此预测航空公司乘客的满意度对于提高服务质量具有重要意义。 ​ 近年来&#xff0c;机器学习在预测领域得到了广泛应用。机器…

机器人入门路线及参考资料(机器人操作方向)

机器人&#xff08;操作方向&#xff09;入门路线及参考资料 前言1 数理基础和编程2 机器人学理论3 计算机视觉4 机器人实操5 专攻方向总结Reference: 前言 随着机器人和具身智能时代的到来&#xff0c;机器人越来越受到大家的重视&#xff0c;本文就介绍了机器人&#xff08;…

基于公有云部署wordpress

云平台选择 腾讯云 阿里云 华为云 项目部署 一、架构讲解 1.1、定义与组成 LNMP是Linux、Nginx、MySQL&#xff08;或MariaDB&#xff09;和PHP&#xff08;或Perl、Python&#xff09;的首字母缩写&#xff0c;代表在Linux系统下使用Nginx作为Web服务器&#xff0c;MySQL作为…

vue3 elementplus Springboot 商品系统,商城类后台管理案例源码

系统演示 项目获取地址 Springboot vue3 elementplus 商品管理系统 商城后台管理系统案例源码 附带系统演示&#xff0c;环境搭建教程,开发工具 技术栈:SpringBoot Vue3 ElementPlus MybatisPlus 开发工具:idea 后端构建工具:Maven 前端构建工具:vite 运行环境:Windows …

Linux基础IO操作详解

C文件IO相关接口 fopen函数 pathname: 要打开的文件名字符串mode: 访问文件的模式 模式描述含义“r”读文件不存在失败返回null“r”读写文件不存在打开失败返回null&#xff0c;文件存在则从头开始覆盖现有的数据&#xff08;不会清空数据&#xff09;“w”写文件不存在创建…

[leetcode]文件组合

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<vector<int>> fileCombination(int target) {vector<vector<int>> vec;vector<int> res;int sum 0, limit (target - 1) / 2; // (target - 1) / 2 等效于 target /…

[机器学习]-4 Transformer介绍和ChatGPT本质

Transformer Transformer是由Vaswani等人在2017年提出的一种深度学习模型架构&#xff0c;最初用于自然语言处理&#xff08;NLP&#xff09;任务&#xff0c;特别是机器翻译。Transformer通过自注意机制和完全基于注意力的架构&#xff0c;核心思想是通过注意力来捕捉输入序列…

RuoYi-Vue项目后端增加自己的模块,要注意的点,只看我这一片就够了。

若依版本&#xff1a; RuoYi-Vue: &#x1f389; 基于SpringBoot&#xff0c;Spring Security&#xff0c;JWT&#xff0c;Vue & Element 的前后端分离权限管理系统&#xff0c;同时提供了 Vue3 的版本 背景&#xff1a; 后端想自己增加一个模块&#xff0c;但是包路径…

气膜建筑照明:吊式与落地灯杆的利弊—轻空间

气膜建筑以其独特的设计和高效的功能性&#xff0c;广泛应用于体育场馆、工厂等各类场所。在这些气膜建筑中&#xff0c;照明方式的选择尤为重要。尽管有多种照明方式可供选择&#xff0c;但常用的反射光源形式在气膜建筑中尤为普遍。轻空间将重点介绍两种常用的反射照明方式&a…

内容营销专家刘鑫炜:越是赚不到钱,越要加大推广力度

这两天&#xff0c;一位跟我们有长期合作关系的小微企业主老苏问我。 “现在钱这么不好赚&#xff0c;品牌推广应该怎么做&#xff1f;” 我说&#xff1a;“这是好机会&#xff0c;加大投放力度&#xff01;” 老苏很是不解&#xff0c;这时候不开源节流&#xff0c;还要加…

激光粒度分析仪计量校准规范:确保测量精度的关键

激光粒度分析仪作为现代科研与工业生产中不可或缺的分析工具&#xff0c;广泛应用于陶瓷、土壤、制药、建材、环保等众多领域。 其通过激光散射原理&#xff0c;快速准确地测量颗粒材料的粒度分布&#xff0c;为材料科学研究、产品质量控制及环境保护等提供了强有力的技术支持…

绘唐3一键追爆款文刻创作聚星文社

聚星文社是一个中国的文学社交平台&#xff0c;提供了一个让作家和读者相互交流和分享作品的平台。 在聚星文社&#xff0c;作家可以在平台上发布自己的作品&#xff0c;获得读者的阅读和评论&#xff0c;同时也可以与其他作家进行交流与学习。 点击下载即可 读者可以在平台上…

视频号视频怎么下载保存到手机,视频号视频如何下载到电脑本地

在数字化浪潮的推动下&#xff0c;视频号成为了我们获取信息、分享生活的重要平台。但有时候&#xff0c;我们遇到一些精彩的内容&#xff0c;想要保存下来以便日后观看&#xff0c;却发现视频号并不提供直接的下载功能。下面我就来为大家详细介绍视频号视频下载的方法&#xf…

maven 打包执行配置(对maven引用的包或者丢进去的包都包含在里面)打成jar包

一 、springboot jar包 maven的pom文件 1 在resources下放了一些文件想打进去jar包 2 在lib下放了其他稀奇古怪jar包文件想打进去jar包 编写如下引入jar <build><!-- 打包名称 --><finalName>${project.artifactId}</finalName><resources><…

【C++】C++指针在线程中调用与受保护内存空间读取方法

引言 在C的多线程编程中&#xff0c;正确地管理内存和同步访问是确保程序稳定性和安全性的关键。特别是当涉及到指针在线程中的调用时&#xff0c;对受保护内存空间的访问必须谨慎处理&#xff0c;以防止数据竞争、死锁和内存损坏等问题。本文将详细探讨C指针在线程中调用时如何…

CV每日论文--2024.6.27

1、Text-Animator: Controllable Visual Text Video Generation 中文标题&#xff1a;Text-Animator&#xff1a;可控视觉文本视频生成 简介&#xff1a;视频生成是各行业中具有重要价值但同时也极具挑战性的任务,例如在游戏、电子商务和广告领域。在文本到视频(T2V)生成中,一…

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

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