当前位置: 首页 > news >正文

Drools规则引擎入门学习记录

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

Drools语法

package 逻辑包名 
dialect 方言名称
import 导入的需要进入规则的对象类型(如需规则使用则要预先将其存入引擎内存)function 函数名称(args){脚本语句...}query 查询名称(与规则名称一致需要为双引号包裹)(args){$result: 规则Pattern
end
}rule “规则名称”
attributes (属性说明,例如no-loop防止死循环)
whenLHS
thenRHS
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>

相关文章:

Drools规则引擎入门学习记录

业务开发过程中&#xff0c;对于某些判断性的通用规则是基于if-else封装&#xff0c;还是基于策略模式封装&#xff1f;无论以上那种封装出来的方法&#xff0c;只能在单体软件包中共用&#xff0c;且不能无感部署&#xff0c;然而对于业务而言&#xff0c;可能规则改变的比较频…...

肖sir__设计测试用例方法之判定表06_(黑盒测试)

设计测试用例方法之判定表 1、判定表&#xff1a;是一种表达逻辑判断的工具。 2、判定表&#xff1a;包含四部分 1&#xff09;条件桩&#xff08;condition stub&#xff09;:列出问题的 所有条件&#xff08;通常条件次序无关紧要&#xff09;。 2&#xff09;条件项&#x…...

<图像处理> 空间滤波基础

空间滤波基础 图像滤波是一种常见的图像处理技术&#xff0c;用于平滑图像、去除噪音和边缘检测等任务。图像滤波的基本原理是在进行卷积操作时&#xff0c;通过把每个像素的值替换为该像素及其邻域的设定的函数值来修改图像。 预备知识&#xff1a;可分离滤波核、边缘填充。…...

如何在Django中使用django-crontab启动定时任务、关闭任务以及关闭指定任务

安装django-crontab包: pip install django-crontab 在Django项目的settings.py文件中&#xff0c;找到INSTALLED_APPS配置&#xff0c;并添加django_crontab到列表中: INSTALLED_APPS [ ... django_crontab,... ] 在settings.py文件的末尾&#xff0c;添加以下配置以设…...

mysql配置项整理

二、&#xff1a;mysql服务器参数 general 基础配置 datadir/var/lib/mysql #数据文件存放的目录 socket/var/lib/mysql/mysql.sock #mysql.socket表示server和client在同一台服务器&#xff0c;并且使用localhost进行连接&#xff0c;就会使用socket进行连接 pid_file/v…...

【KRouter】一个简单且轻量级的Kotlin Routing框架

【KRouter】一个简单且轻量级的Kotlin Routing框架 KRouter&#xff08;Kotlin-Router&#xff09;是一个简单而轻量级的Kotlin路由框架。 具体来说&#xff0c;KRouter是一个通过URI来发现接口实现类的框架。它的使用方式如下&#xff1a; val homeScreen KRouter.route&l…...

时间管理类书籍阅读笔记

背景 这段时间看了时间管理方面的书籍&#xff0c;大部分和早晨时间利用相关。之所以有了利用早晨时间的想法&#xff0c;是某天下班后&#xff0c;感觉很疲惫&#xff0c;什么都不想做&#xff0c;于是就打了一晚上游戏&#xff0c;然后第二天重复着这样的生活。 突然意识到…...

CSS文字居中对齐学习

CSS使用text-align属性设置文字对齐方式&#xff1b;text-align:center&#xff0c;这样就设置了文字居中对齐&#xff1b; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>css 水平居中</title><style>.box …...

《论文阅读》CARE:通过条件图生成的共情回复因果关系推理 EMNLP 2022

《论文阅读》CARE:通过条件图生成的移情反应因果关系推理 前言简介基础知识TransformerVariational Graph Auto-Encoder 变分图自编码器`邻接矩阵(adjacency matrix)``图神经网络(GNN)``图卷积神经网络(GCN)``自编码器(Auto Encoder)``图自编码器(GAE)``变分图自编码…...

React 开发一个移动端项目(1)

技术栈&#xff1a; 项目搭建&#xff1a;React 官方脚手架 create-react-appreact hooks状态管理&#xff1a;redux 、 redux-thunkUI 组件库&#xff1a;antd-mobileajax请求库&#xff1a;axios路由&#xff1a;react-router-dom 以及 historyCSS 预编译器&#xff1a;sass…...

c#查看代码的执行耗时( Stopwatch )

我们如果需要看某段代码的执行耗时&#xff0c;会通过如下的方式进行查看 using System.Diagnostics; private void button1_Click(object sender, EventArgs e){Stopwatch sw Stopwatch.StartNew();//sw.Start();StringBuilder sb new StringBuilder();for(int i 0; i <…...

Python网络爬虫库:轻松提取网页数据的利器

网络爬虫是一种自动化程序&#xff0c;它可以通过访问网页并提取所需的数据。Python是一种流行的编程语言&#xff0c;拥有许多强大的网络爬虫库。在本文中&#xff0c;我们将介绍几个常用的Python网络爬虫库以及它们的使用。 Requests库 Requests是一个简单而优雅的HTTP库&…...

YOLOv5算法改进(15)— 更换Neck之AFPN

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。在YOLOv5中添加AFPN&#xff08;Adaptive Feature Pyramid Network&#xff09;可以提高目标检测的准确性。AFPN是一种用于目标检测任务的功能增强模块&#xff0c;它能够自适应地融合来自不同层级的特征图&#xff0c;以提…...

Vue2项目练手——通用后台管理项目第七节

Vue2项目练手——通用后台管理项目 用户管理分页使用的组件Users.vuemock.js 关键字搜索区Users.vue 权限管理登录页面样式修改Login.vue 登录权限使用token对用户鉴&#xff0c;使用cookie对当前信息保存&#xff08;类似localstorage&#xff09;Login.vuerouter/index.js 登…...

《Web安全基础》04. 文件操作安全

web 1&#xff1a;文件操作安全2&#xff1a;文件上传漏洞2.1&#xff1a;简介2.2&#xff1a;防护与绕过2.3&#xff1a;WAF 绕过2.3.1&#xff1a;数据溢出2.3.2&#xff1a;符号变异2.3.3&#xff1a;数据截断2.3.4&#xff1a;重复数据 3&#xff1a;文件包含漏洞4&#xf…...

docker-compose安装nginx

基于docker-compose安装nginx 目录 一、目录结构 1、docker-compose.yml 2、nginx.conf 3、default.conf 4、index.html 二、访问测试 一、目录结构 1、docker-compose.yml version: 3 services:nginx:image: registry.cn-hangzhou.aliyuncs.com/zhengqing/nginx:1.21.1…...

报错处理:MySQL无法启动

报错环境&#xff1a; Linux MySQL 具体报错&#xff1a; Cant connect to local MySQL server through socket /var/run/mysqld/mysqld.sock 排错思路&#xff1a; 当尝试启动MySQL服务时&#xff0c;如果出现无法连接到MySQL服务的错误&#xff0c;可能是由于MySQL服务未正确…...

Vue中表单手机号验证与手机号归属地查询

下面是一篇关于Vue中如何进行表单手机号验证与手机号归属地查询的Markdown格式的文章&#xff0c;包含代码示例。 Vue中表单手机号验证与手机号归属地查询 手机号验证和归属地查询是许多Web应用程序中常见的功能之一。在Vue.js中&#xff0c;我们可以轻松地实现这两个功能。本…...

初高(重要的是高中)中数学知识点综合

1. 集合 1.1 集合的由来和确定性 确定对象构成的整体称为集合&#xff08;组成集合的元素必须是确定的 &#xff09;&#xff0c;每个集合内的对象个体成为元素(Element)。确定性&#xff1a; 给定一个集合&#xff0c;任何一个对象是不是这个集合内的元素&#xff0c;就已经确…...

Fiddler 系列教程(二) Composer创建和发送HTTP Request跟手机抓包

Fiddler Composer介绍 Composer的官方帮助文档&#xff1a;http://www.fiddler2.com/fiddler/help/composer.asp Fiddler的作者把HTTP Request发射器取名叫Composer(中文意思是&#xff1a;乐曲的创造者), 很有诗意 Fiddler Composer的功能就是用来创建HTTP Request 然后发送…...

淘宝平台开放接口API接口

淘宝平台开放接口API接口是指淘宝平台提供给第三方开发者的一组接口&#xff0c;用于实现与淘宝平台的数据交互和功能扩展。通过API接口&#xff0c;第三方开发者可以获取淘宝平台上的商品信息、订单信息、用户信息等数据&#xff0c;也可以实现商品的发布、订单的创建和支付等…...

缓存夺命连环问

1. 为什么要用缓存&#xff1f; 用缓存&#xff0c;主要有两个用途&#xff1a;高性能、高并发。 高性能 假设这么个场景&#xff0c;你有个操作&#xff0c;一个请求过来&#xff0c;吭哧吭哧你各种乱七八糟操作 MySQL&#xff0c;半天查出来一个结果&#xff0c;耗时 600m…...

模型生成自动化测试用例

自动产生的测试用例本就应该由程序自动执行&#xff0c;这其实也就是NModel推荐的模式。先回过头来看看文章中制作的模型&#xff0c;模型里面将登录、注销、用户名以及密码等要素都抽象出来了&#xff0c;而NModel是以这些抽象出来的动作&#xff08;登录、注销&#xff09;和…...

归并排序-面试例子

小数和问题 描述 在一个数组中&#xff0c;一个数左边比它小的数的总和&#xff0c;叫数的小和&#xff0c;所有数的小和累加起来&#xff0c;叫数组小和。求数组小和。 例子 5 2 6 1 7 小和原始的求法是&#xff1a;任何一个数左边比它小的数累加起来。 5左边比它小数累加…...

docker 生成镜像的几个问题

docker 生成镜像的几个问题 根据jdk8.tar.gz 打包Jdk8 镜像失败运行镜像报错差不多是网络ip错误,在网上说重启docker即可解决运行mysql5.7.25 镜像失败向daemon.json文件添加内容导致docker重启失败docker run 命令常用参数根据jdk8.tar.gz 打包Jdk8 镜像失败 首选做准备工作…...

云计算时代的采集利器

大家好&#xff01;在今天的知识分享中&#xff0c;我们将探讨一个在云计算环境中的爬虫应用利器——独享IP。如果你是一名爬虫程序员&#xff0c;或者对数据采集和网络爬虫有浓厚的兴趣&#xff0c;那么这篇文章将向你展示独享IP在云计算环境下的应用价值。 1. 什么是独享IP&…...

【Unity编辑器扩展】| Inspector监视器面板扩展

前言【Unity编辑器扩展】| Inspector监视器面板扩展一、ContextMenu和ContextMenuItem二、Custom Editors 自定义编辑器三、Property Drawer 属性绘制器总结前言 前面我们介绍了Unity中编辑器扩展的一些基本概念及基础知识,还有编辑器扩展中用到的相关特性Attribute介绍。后面…...

Redis配置

关系型数据库和非关系型数据库 ①了解关系和非关系 关系型数据库 一个结构化的数据库&#xff0c;创建在关系模型基础上&#xff0c;一般面向于记录&#xff0c;包括Oracle、MySQL、SQL Server、Microsoft Access、DB2、postgreSQL等 非关系型数据库 除了主流的关系型数据库…...

CSDN每日一练 |『小艺照镜子』『Ctrl+X,Ctrl+V』『括号上色』2023-09-11

CSDN每日一练 |『小艺照镜子』『Ctrl+X,Ctrl+V』『括号上色』2023-09-11 一、题目名称:小艺照镜子二、题目名称:Ctrl+X,Ctrl+V三、题目名称:括号上色一、题目名称:小艺照镜子 时间限制:1000ms内存限制:256M 题目描述: 已知字符串str。 输出字符串str中最长回文串的长度…...

React 全栈体系(四)

第二章 React面向组件编程 六、组件的生命周期 1. 效果 需求:定义组件实现以下功能&#xff1a; 让指定的文本做显示 / 隐藏的渐变动画从完全可见&#xff0c;到彻底消失&#xff0c;耗时2S点击“不活了”按钮从界面中卸载组件 <!DOCTYPE html> <html lang"e…...

门户网站建设好处/网络营销模式包括哪些

上一次我们一起重温了JS中数组相关的内容&#xff0c;这一次我们要来学习ES6新引入的两个数据结构&#xff1a;map和set。map和对象比较像&#xff0c;可以用键来获取值&#xff0c;set则和数组比较像&#xff0c;但是不允许出现重复的值。下面我们就进入详细地学习吧&#xff…...

漯河网站优化/成功营销案例分享

一、分析什么是顺序表&#xff1f;顺序表是指用一组地址连续的存储单元依次存储各个元素&#xff0c;使得在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中的线性表。一个标准的顺序表需要实现以下基本操作&#xff1a;1、初始化顺序表2、销毁顺序表3、清空顺序表4、检测…...

做网站可能遇到的困难/优化营商环境条例解读

###转载于:https://www.cnblogs.com/tinaluo/p/9278671.html...

伊春网站推广/一键优化

根据参考一些网络资料收集整理:因为使用代码添加的 每一次添加一个控件容器控件内部都做了自动计算 主要在这两句代码headerRow.Cells.Add(headerCell);detailRow.Cells.Add(detailCell);向XRTableRow 添加 XRTableCell 第一次新添加的会XRTableCell会以XRTableRow 的宽度值第二…...

怎么做自己的个人网站/从哪里找网络推广公司

以下内容全部来自 Transforms Ⅰ. Transforms 简而言之&#xff0c;就是训练的数据有时候并不是机器学习训练的数据格式&#xff0c;这个时候就需要 Transforms 对数据进行一些操作&#xff08;转换&#xff09;&#xff0c;使其适合做神经网络的输入。比如对于图像数据&…...

wordpress博客页修改/百度营销推广靠谱吗

一、废话 听说很多地方都降温了&#xff0c;希望大家注意身体&#xff0c;别冻着了&#xff01; 二、正文 在Android的网络通讯中&#xff0c;通常会使用Socket进行设备间数的数据通讯&#xff0c;使用Http来对网络数据进行请求。 1、Socket&#xff08;套接字&#xff09; 不管…...