Drools规则引擎入门学习记录

2023-11-03

业务开发过程中,对于某些判断性的通用规则是基于if-else封装,还是基于策略模式封装?无论以上那种封装出来的方法,只能在单体软件包中共用,且不能无感部署,然而对于业务而言,可能规则改变的比较频繁,例如与营销有关的活动,会频繁的修改商品价格的判断,不断的修改规则,在业务划分上,这类的业务功能被称为风险控制,因此学习规则文件以及加载执行规则文件的规则引擎则是我自己对于风险控制领域业务领域理解的必要前提。

Drools语法

package 逻辑包名 
dialect 方言名称
import 导入的需要进入规则的对象类型(如需规则使用则要预先将其存入引擎内存)

function 函数名称(args){脚本语句...}

query 查询名称(与规则名称一致需要为双引号包裹)(args){
    $result: 规则Pattern
end
}

rule “规则名称”
attributes (属性说明,例如no-loop防止死循环)
when
    LHS
then
    RHS
end

LHS关键语法释义

LHS部分为空语句时,自动翻译成eval(true)直接通过条件判断进入RHS执行流程。值得一提的是eval()语句内部支持任何可以执行的语句,只要它执行的结果会返回一个布尔类型的值。

LHS部分为类似$user:User(age >= 18)语句时,其意为拿到引擎内部的Working memory 中类型为导入的User的相应Fact对象并匹配age大于等于18的对象,如果存在则返回true反之返回false,同时支持多个类似的属性匹配语句:例如$user:User( age >= 18 and name = ‘name’)

LHS满足的条件限制语句包含:and、or、||、&&以及not、in、exists、forall、from、collect、accumulate等。

RHS关键语法释义

通常来看RHS是通过条件判断时,需要执行的逻辑代码,不应该存在判断逻辑。

推荐JAVA业务逻辑触发方式:

  1. 编写SpringHolder静态导入Bean对象,执行需要执行的service代码。
  2. 删除部分适配的fact对象,脚本外部编写监听器监听对象消除时执行业务逻辑。
  3. 注册规则引擎自带的Channel实现channels[通道名].send()发送消息,同时Java代码内部订阅此通道即可。

规则引擎提供的快速访问修改working memory内存对象中的方法有:新增insert、修改update、删除retract。其次提供外宏对象drools调用更多API,kcontext宏对象直接访问运行时working memory内部的fact对象。

函数function用法释义

需要注意的是drools自带的function函数类似于JavaScript中的函数,但是在规则引擎中,一般的function函数需要返回一个布尔类型或者带返回类型,规范用法则是在LHS中使用eval(function(args))进行使用。

查询query用法释义

这里的查询代码相当于LHS部分,只是它需要以end结束,告知引擎本次查询结束,可以接收返回值,根据返回值决定后续流程。

query ”query_user_name“(arg){
    $user: User(name = arg)
end  
}

注:global关键字与Java中的final static基本一致,在同一个session中可以全局共享使用。

针对Drools属性的说明

位置在举例代码中的attributes即是Drools规则的属性

常见的属性配置有:Salience优先级(规则的优先级越高越先执行,默认为0)、no-loop(防止规则的死循环执行,值为false时可能会由规则引擎循环执行)、date-effective(日期计划,当日期到达后面的值时才会执行规则)、date-expires(日期比较,当日期超过后面的日期时才会执行)、Dialect(定义规则中的方言类型,一般分为eval与java)、Enable(规则是否启用)、lock-on-active(规则限制只运行一次)、activation-group(规则分组)。

Drools核心类型说明

  1. fact:类似于Java对象的引用,如果调用kieSession.insert( javaBean对象)方法,那么就会在working memory中插入一个JavaBean对象的引用。这个fact指的就是这次插入JavaBean的引用对象(引用对象即为装着源对象地址的对象,访问时直接拿到地址访问源对象)
  2. KieServices:类似于规则引擎提供的操作中心,通过它来获取的各种对象来完成规则构建、管理和执行等操作(通过KieServices.Factory.get() 获得)
  3. KieBase:可以理解为一个知识仓库,包含了若干的规则、流程、方法等,在 Drools 中主要就是规则和方法,KieBase 本身并不包含运行时的数据之类的,如果需要执行规则 KieBase中的规则的话,就需要根据 KieBase 创建 KieSession(通过KieContainer.getKieBase() 或 newKieBase()获得)
  4. KieContainer: KieBase 的容器,利用 KieContainer 来访问 KBase 和 KSession 等信息;(通过KieServices.newKieContainer()获得)
  5. KieSession:跟 Drools 引擎打交道的会话,基于 KieBase 创建,它会包含运行时数据,包含“事实 Fact”,并对运行时数据事实进行规则运算;分为两类:有状态的 KieSession(在多次与规则引擎进行交互中,维护会话的状态)、无状态的 StatelessKieSession(隔离了每次与规则引擎的交互,不会维护会话的状态)(通过KieBase.newStatelessKieSession() 或 newKieSession()获得)
  6. KieRepository:单例对象,它是一个存放 KieModule 的仓库
  7. KieProject:KieContainer 通过 KieProject 来初始化、构造 KieModule,并将 KieModule 存放到 KieRepository 中,然后 KieContainer 可以通过 KieProject 来查找 KieModule 定义的信息,并根据这些信息构造 KieBase 和KieSession
  8. ClasspathKieProject:ClasspathKieProject 实现了 KieProject 接口,它提供了根据类路径中的 META-INF/kmodule.xml 文件构造 KieModule 的能力,也就是我们能够基于 Maven 构造 Drools 组件的基本保障之一

设计实现运行Drools规则引擎的方法

  1. java硬编码嵌入规则到Java程序中,利用KieHelper().addContent(DRL硬编码字符串,ResourceType.DRL).build方法获取一个KieBase对象,通过KieBase对象获取KieSession会话,通过KieSession对象的execute方法传入判断的JavaBean运行。
  2. 创建规则文件夹,动态的利用Resource类获取文件对象,利用KieHelper对象的addResource方法传入规则文件resource对象,后续与(1)类似。
  3. 设计创建spring-drools.xml文件,将规则文件夹全部添加进配置文件中。后续利用注解配置类即可:
@Configuration
@ImportResource("classpath:spring-drools.xml")
public class DroolsBeansConfig {

}

设计可实现的风控系统架构

主体思路:将规则条件封入字典表或枚举中,所有的规则导入规则表中,实例化配置javaBean,专门执行规则的加载与执行。

待更新......

相关资料

Maven依赖:

<dependency>
   <groupId>org.kie</groupId>
   <artifactId>kie-spring</artifactId>
   <version>7.55.0.Final</version>
</dependency>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Drools规则引擎入门学习记录 的相关文章

随机推荐

  • CSS布局flex布局 对齐 等分 均分 详解

    一切都始于这样一个问题 怎样通过 CSS 简单而优雅的实现水平 垂直同时居中 记得刚开始学习 CSS 的时候 看到float属性不由得感觉眼前一亮 顺理成章的联想到 Word 文档排版中用到的的左对齐 右对齐和居中对齐 然而很快就失望的发现
  • 【leetcode】1143.最长公共子序列

    leetcode 1143 最长公共子序列 题目 思路 代码 复杂度 题目 leetcode原题链接 给定两个字符串 text1 和 text2 返回这两个字符串的最长 公共子序列 的长度 如果不存在 公共子序列 返回 0 一个字符串的 子
  • 如何快速查看并定位网页元素代码

    如何快速查看并定位网页元素代码 目的 可以迅速得找出一个网页中对应元素的html代码 1 首先我们打开一个网页 比如 百度首页 2 打开后我们会看到很多的文字链接以及按钮链接 那么我们找到我们想要查看的元素的文字或者按钮 3 我们这里以 百
  • @Cacheable注解属性介绍

    本文目录 1 value cacheNames 属性 2 key属性 3 keyGenerator 属性 4 cacheManager 属性 5 cacheResolver 属性 6 condition 属性 7 unless 属性 8 s
  • C++导出EXCEL开源库xlslib库使用心得

    使用教程 第一步 下载xlslib库 本文建立在xlslib2 5 0版本基础上 下载地址xlsLib download SourceForge net 第二步 切换到解压文件目录xlslib build msvc2008 打开项目xlsl
  • linux查询jvm运行内存使用情况,在Linux下获取正在运行的JVM的总使用内存

    您可以运行 ps aux grep java 这将显示包含在其推出的字符串java的每个应用程序的内存使用情况 这应该是大多数 如果不是所有的Java应用程序 从我的服务器的输出如下 servername servername ps aux
  • 超过飞飞系列-ZYNQ之FPGA学习2.1Verilog语法

    一 VHDL Verilog C语言区别 VHDL 硬件描述语言 美军开发 相对难 不直观 需要专业培训 欧洲发展较好 Verilog 硬件描述语言 设计群体广泛 资源成熟 中国多采用 并行处理运行 C 软件语言 经过C的单片机程序需取码
  • 简单工厂(Simple Factory)

    文章目录 1 代码示例 2 简单工厂模式的定义 实现意图 工厂模式 通过把创建对象的代码包装起来 做到创建对象的代码与具体的业务逻辑代码相隔离的目的 工厂模式可以细分为 简单工厂模式 工厂方法模式 抽象工厂模式 1 代码示例 include
  • servlet实现图片的上传

    servlet实现图片的上传 我们通常说的上传图片 是将图片上传到服务器上面 本篇以tomcat为例 实现简单的本地图片上传服务器 一 图片的上传需要引入两个jar包 commons fileupload 1 4 jar 下载地址 http
  • 深度详解 View.post() 为何能够获取到 View 的宽高值?

    文章目录 1 简介 1 1 问题描述 1 2 结果展示 2 源码分析 2 1 View post 方法添加任务 2 2 HandlerActionQueue post 方法添加任务 2 3 探究 AttachInfo 的由来 2 3 1 A
  • 爬取在线论坛帖子:使用 Python 获取帖子及评论

    在这篇博客中 我们将学习如何使用 Python 编写一个网络爬虫 从一个在线论坛 例如 Reddit 中获取帖子及其评论 我们将使用 requests 和 BeautifulSoup 库来实现这个功能 文章将包括以下内容 目录 1 爬虫的基
  • 重写、覆盖、重载、隐藏、多态几个概念的区别分析

    override gt 重写 覆盖 overload gt 重载 polymorphism gt 多态 override是重写 覆盖 了一个方法 以实现不同的功能 一般是用于子类在继承父类时 重写 重新实现 父类中的方法 成员函数的重载 o
  • 论文阅读:CLIP2Video: Mastering Video-Text Retrieval via Image CLIP

    动机 之前的大多都是试图从大规模的视频文本数据集中提取视频的时空特征以及视频和语言之间的多模式交互 作者将在图像语言中预训练的模型迁移到视频文本检索任务中 而之前这种使用这种方式的工作大多都是基于证明这种迁移学习是有效的 以验证CLIP模型
  • [BABEL] Note: The code generator has deoptimised the styling of "unknown" as it exceeds the max of "

    BABEL Note The code generator has deoptimised the styling of unknown as it exceeds the max of 500KB babelrc文件添加 compact
  • 构建Python pandas基于SSH远程MySQL和PostgreSQL的数据分析

    如果您无法从外部环境直接访问数据库 则可能需要SSH隧道来查询它 在这篇文章中 我将向您展示如何通过SSH连接并查询MySQL数据库到Pandas数据框 可以将相同的代码应用于连接到其他数据库 例如PostgreSQL 假设您的数据库托管在
  • Spring 基础教程之一:Spring简介

    明天就要讲传说中的spring了 不知道它是否像老师说的那样简单且神奇 spring的英文翻译是春天 泉水 弹簧 活跃的意思 不知道像我们这样的距找工作还有50天左右的人来说 我们的春天是否到了 在这个春天我们是否能够喝上甘甜的泉水 然后像
  • aps是什么意思_全画幅大还是中画幅大? 为什么说底大一级压死人

    经典摄影教程 总第十期 书接上文 是什么造成了画面的 空间感 其中我们谈到了当我们使用不同焦距的时候 我们的拍摄距离往往也会改变 但是这个焦距说的就是等效焦距 在什么是等效焦距 一文中 也说了等效焦距是因为传感器大小不同产生的讨厌的东西 那
  • Redis零基础小白篇

    一 Redis概述 1 是什么 是存在内存中的数据库 是Key Value数据库 MySQL是关系数据库 2 能干什么 一个程序中大部分操作都是查询 少部分操作是写入 所以用MySQL作存储 Redis作查询 所有查询先查询Redis 没有
  • 用遗传算法(GA)做最优化:找一元及多元函数的最大值

    一元函数 对于如下图所示的一元函数求解其在区间 0 7 内的最大值有多种方式 在本文中分享的是用一种启发式算法 遗传算法来完成这项工作 大家对遗传算法不了解的话可以戳这里看简介 首先介绍我们的主角 也就是目标函数的形式 其定义如下 def
  • Drools规则引擎入门学习记录

    业务开发过程中 对于某些判断性的通用规则是基于if else封装 还是基于策略模式封装 无论以上那种封装出来的方法 只能在单体软件包中共用 且不能无感部署 然而对于业务而言 可能规则改变的比较频繁 例如与营销有关的活动 会频繁的修改商品价格