规则引擎----easy rules
一、规则引擎的作用
将复杂的if else判断剥离出来
二、使用
2.1、引入POM
<!--easy rules核心库--><dependency><groupId>org.jeasy</groupId><artifactId>easy-rules-core</artifactId><version>3.3.0</version></dependency><!--规则定义文件格式,支持json,yaml等--><dependency><groupId>org.jeasy</groupId><artifactId>easy-rules-support</artifactId><version>3.3.0</version></dependency><!--支持mvel规则语法库--><dependency><groupId>org.jeasy</groupId><artifactId>easy-rules-mvel</artifactId><version>3.3.0</version>
2.2、编写规则
2.2.1、注解
package com.xx.rule.number;import org.jeasy.rules.annotation.Action;
import org.jeasy.rules.annotation.Condition;
import org.jeasy.rules.annotation.Fact;
import org.jeasy.rules.annotation.Rule;/*** @author aqi* @date 2023/5/6 16:03*/
@Rule(name = "被3整除", description = "number如果被3整除,打印:number is 3", priority = 1)
public class ThreeRule {/*** Condition:条件判断注解:如果return true, 执行Action*/@Conditionpublic boolean isThree(@Fact("number") int number) {return number % 3 == 0;}/*** Action 执行方法注解*/@Actionpublic void threeAction(@Fact("number") int number) {System.out.println(number + ":可以被3整除");}
}
2.2.2、表达式
MVELRule ageRule = new MVELRule().name("age rule").description("判断这个人是否成年,是否可以饮酒").priority(1).when("person.age > 18").then("person.setAdult(true);");
2.2.3 yml配置文件
name: "alcohol rule"
description: "children are not allowed to buy alcohol"
priority: 2
condition: "person.isAdult() == false"
actions:- "System.out.println(\"你还未满18岁!\");"
2.2.4 组合规则
UnitRuleGroup myUnitRuleGroup = new UnitRuleGroup("myUnitRuleGroup", "组合规则");myUnitRuleGroup.addRule(ageRule);myUnitRuleGroup.addRule(alcoholRule);
2.2.5 组合规则说明
类 | 说明 |
---|---|
UnitRuleGroup | 要么应用所有规则,要么不应用任何规则(AND逻辑) |
ActivationRuleGroup | 它触发第一个适用规则,并忽略组中的其他规则(XOR逻辑) |
ConditionalRuleGroup | 如果具有最高优先级的规则计算结果为true,则触发其余规则 |
2.2.6 字段说明
字段 | 说明 |
---|---|
name | 规则名称 |
description | 规则描述 |
priority | 规则执行顺序,越小越先执行 |
condition | 条件 |
actions | 满足条件之后的执行动作 |
2.3、规则使用
2.3.1、注解规则使用
package com.xx;import com.xx.rule.number.ThreeRule;
import org.jeasy.rules.api.Facts;
import org.jeasy.rules.api.Rules;
import org.jeasy.rules.api.RulesEngine;
import org.jeasy.rules.core.DefaultRulesEngine;public class Main {public static void main(String[] args) {// 创建规则执行引擎RulesEngine rulesEngine = new DefaultRulesEngine();// 创建规则Rules rules = new Rules();rules.register(new ThreeRule());// 设置参数Facts facts = new Facts();for (int i = 1; i <= 50; i++) {//规则因素,对应的name,要和规则里面的@Fact 一致facts.put("number", i);//执行规则rulesEngine.fire(rules, facts);System.out.println();}}
}
2.3.2、表达式和yml规则使用
package com.xx;import com.xx.domain.Person;
import org.jeasy.rules.api.Facts;
import org.jeasy.rules.api.Rule;
import org.jeasy.rules.api.Rules;
import org.jeasy.rules.api.RulesEngine;
import org.jeasy.rules.core.DefaultRulesEngine;
import org.jeasy.rules.core.RuleBuilder;
import org.jeasy.rules.mvel.MVELRuleFactory;
import org.jeasy.rules.support.YamlRuleDefinitionReader;
import org.springframework.util.ResourceUtils;import java.io.FileReader;/*** 基于MVEL表达式实现规则引擎* @author aqi*/
public class ShopMain {public static void main(String[] args) throws Exception {Person person = new Person();person.setName("tom");person.setAge(20);Facts facts = new Facts();facts.put("person", person);// 表达式Rule ageRule = new RuleBuilder().name("age rule").description("判断这个人是否成年,是否可以饮酒").when(e -> Integer.parseInt(e.get("person.age")) > 18).then(e -> e.put("person.adult", true)).build();// yml配置文件Rule alcoholRule = new MVELRuleFactory(new YamlRuleDefinitionReader()).createRule(new FileReader(ResourceUtils.getFile("classpath:alcohol-rule.yml")));Rules rules = new Rules();rules.register(ageRule);rules.register(alcoholRule);//创建规则执行引擎,并执行规则RulesEngine rulesEngine = new DefaultRulesEngine();rulesEngine.fire(rules, facts);System.out.println(person);}
}
2.3.1、规则引擎可配参数
参数 | 说明 |
---|---|
skipOnFirstAppliedRule | 当一个规则成功应用时,跳过余下的规则 |
skipOnFirstFailedRule | 当一个规则失败时,跳过余下的规则 |
skipOnFirstNonTriggeredRule | 当一个规则未触发时,跳过余下的规则 |
rulePriorityThreshold | 当优先级超过指定的阈值时,跳过余下的规则 |
通过如下方式设置
RulesEngineParameters parameters = new RulesEngineParameters().skipOnFirstAppliedRule(true);RulesEngine rulesEngine = new DefaultRulesEngine(parameters);
相关文章:
规则引擎----easy rules
一、规则引擎的作用 将复杂的if else判断剥离出来 二、使用 2.1、引入POM <!--easy rules核心库--><dependency><groupId>org.jeasy</groupId><artifactId>easy-rules-core</artifactId><version>3.3.0</version></depe…...
你手写过一把锁吗?你对轮询缓存怎么看?
当多个线程同时去操作一块内存的数据时如果不做一些限制,极其可能出现数据一致性问题。这时候,我们用一把锁锁住这块数据,持有钥匙者可以进入,不持有者等待钥匙用完再分配。所以在我看来啊,锁的本质就是一个标志位&…...
深入理解 spring-boot-starter-parent
目录 一、前言二、Maven继承三、分析spring-boot-starter-parent四、Maven单继承问题五、不继承spring-boot-starter-parent需要注意的 一、前言 在idea当中创建springboot项目的时候都会继承一个spring-boot-starter-parent作为父类,假如不继承我们的项目就不能使…...
基于SpringBoot的线上日志阅读器
软件特点 部署后能通过浏览器查看线上日志。支持Linux、Windows服务器。采用随机读取的方式,支持大文件的读取。支持实时打印新增的日志(类终端)。支持日志搜索。 使用手册 基本页面 配置路径 配置日志所在的目录,配置后按回车…...
【Leetcode -405.数字转换为十六进制数 - 409.最长回文串】
Leetcode Leetcode -405.数字转换为十六进制数Leetcode - 409.最长回文串 Leetcode -405.数字转换为十六进制数 题目:给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。 注意 : 十六进制中所有…...
剑指 Offer:003 前 n 个数字二进制中 1 的个数
题目: 给定一个非负整数 n,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组 示例: 1、 输入: n 2 输出: [0,1,1] 解释: 0 --> 0 1 --> 1 2 --> 10 2、 输入: n 5 输出: [0,1,1,2,1,2] 解释: 0 …...
DDD系列:二、应用架构设计演变
作用: 通过规定一个固定的架构设计,可以让团队内有一个统一的开发规范,降低沟通成本,提升效率和代码质量。 目标: 在做架构设计时,一个好的架构应该需要实现以下几个目标: 独立于UI:前…...
Spring-IOC
IOC概念和原理 什么是IOC 控制反转,为了将系统的耦合度降低,把对象的创建和对象直接的调用过程权限交给Spring进行管理。 IOC底层原理 XML解析 通过Java代码解析XML配置文件或者注解得到对应的类的全路径,获取对应的Class类 Class clazz …...
基于Java语言开发B/S架构实现的云HIS
一、云HIS系统框架简介 1、技术框架 (1)总体框架: SaaS应用,全浏览器访问 前后端分离,多服务协同 服务可拆分,功能易扩展 (2)技术细节: 前端:AngularNg…...
清洁赛道新势力,米博凭“减法”突围?
在五四青年节这个特殊的日子,方太旗下的高端智能清洁品牌“米博”发布了新一代无滚布洗地机7系列。 5月4日晚,米博以“减法生活,净请7代”为主题,举办了新品发布会。在发布会上,从小红书翻红的董洁作为方太集团米博产…...
代码随想录训练营Day6| 242、349、202、1
242. 有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 class Solution {public boolean isAnagram(String s, String t)…...
IP-GUARD如何通过网络控制策略禁止应用程序联网?
如何通过网络控制策略禁止应用程序联网? 可以在控制台-高级-网络控制中,添加以下策略: 动作:“禁止” 应用程序:填写要禁止的程序(以QQ示例) 如何禁止没有安装客户端的电脑访问客户端电脑? 可以给所有客户端设置只允许客户端电脑访问的网络控制策略; 在控制台左边的…...
Java RSA密钥转换,从RSAPrivateKey得到RSAPublicKey
概述: 在Java编程中,我们经常用到如下一段代码来生成RSA公私钥,分别拿到公私钥然后加解密计算: KeyPairGenerator keyPairGen; keyPairGen KeyPairGenerator.getInstance("RSA"); keyPairGen.initialize(2048, new S…...
Android 12.0 Launcher3仿ios长按app图标实现抖动动画开始拖拽停止动画
1.概述 在12.0的系统rom定制化开发中,在对系统原生Launcher3的定制需求中,也有好多功能定制的,在ios等电子产品中 的一些好用的功能,也是可以被拿来借用的,所以在最近的产品开发需求中,需求要求模仿ios的 功能实现长按app图标实现抖动动画,接下来看如何分析该功能的实现…...
【五一创作】50道Java面试题
Java中的四种访问权限控制符分别是什么? 答:Java中的四种访问权限控制符分别是public、protected、default和private。 Java中的反射是什么?有什么作用? 答:Java中的反射是指在程序运行时动态获取类的信息和调用对象…...
4。计算机组成原理(3)指令系统
嵌入式软件开发,非科班专业必须掌握的基本计算机知识 核心知识点:数据表示和运算、存储系统、指令系统、总线系统、中央处理器、输入输出系统 指令系统(Instruction Set)是计算机体系结构的关键组成部分之一,它定义了处…...
【Elasticsearch】NLP简单应用
文章目录 NLP简介ES中的自然语言处理(NLP)NLP演示将opennlp插件放在ESplugins路径中下载NER模型配置opennlp重启ES、验证 NLP简介 NLP代表自然语言处理,是计算机科学和人工智能领域的一个分支。它涉及使用计算机来处理、分析和生成自然语言,例如英语、中…...
3. 云计算的落地实践(下)
本章讲解知识点 云计算如何落地实践ISO镜像文件创建虚拟机入门创建数据节点配置VMWare创建虚拟机三种网络模式1. 云计算的落地实践 上一章我们讲了云计算的业界实践,即:搭建IaaS后,用于创建虚拟机,在虚拟机上部署PaaS,用于管理同时部署在虚拟机上的容器,这就是业界普遍的…...
javaEE+mysql学生竞赛管理系统
本系统是基于JAVA平台开发的一套学生竞赛信息管理的系统。系统采用JSP为编程语言。数据库采用Mysql建立数据之间的转换。论文主要介绍了本课题的开发背景,所要完成的功能和开发的过程。重点的说明了系统设计的重点、设计思想、难点技术和解决方案。 本课题的目的是使…...
车辆出险记录查询API接口
车辆出险记录接口可以帮助车主、保险公司、交通管理部门等各方快速查询车辆的出险记录,了解车辆风险情况、核算保险费用等。这篇文章将探讨车辆出险记录接口的作用、应用场景、使用方式以及一些注意事项。 作用: 车辆出险记录接口主要解决了快速获取车…...
MySQL的概念,编译及安装
一.数据库的基本概念 1、数据(Data) • 描述事物的符号记录 • 包括数字,文字,图形,图像,声音,档案记录等 • 以“记录”形式按统一的格式进行存储 2、表 • 将不同的记录组织在一起 • …...
系统性能压力测试
系统性能压力测试 一、压力测试 压力测试是给软件不断加压,强制其在极限的情况下运行,观察它可以运行到何种程度,从而发现性能缺陷,是通过搭建与实际环境相似的测试环境,通过测试程序在同一时间内或某一段时间内&…...
从零开始学习Linux运维,成为IT领域翘楚(三)
文章目录 🔥Linux超级用户与伪用户🔥Linux文件基本属性🔥Linux权限字与权限操作 🔥Linux超级用户与伪用户 Linux下用户分为三类:超级用户、普通用户、伪用户 ⭐ 超级用户:用户名为root,具有一切…...
轻松搭建自己的ChatGPT聊天机器人,让AI陪你聊天!
随着人工智能技术的发展,聊天机器人已经成为了我们生活中的一部分。无论是在客服机器人上还是智能助手上,聊天机器人都能够给我们带来真正的便利和快乐。现在,你也可以轻松搭建自己的ChatGPT聊天机器人,和它天马行空地聊天&#x…...
CompletableFutrue异步处理
异步处理 一、线程的实现方式 1. 线程的实现方式 1.1 继承Thread class ThreadDemo01 extends Thread{Overridepublic void run() {System.out.println("当前线程:" Thread.currentThread().getName());} }1.2 实现Runnable接口 class ThreadDemo02 implements …...
【前端面经】JS-对象的可枚举性
JavaScript中的对象是非常重要的数据类型,它们作为编程中的基础构建块,可以被用来表示各种数据结构。对象是由属性构成的,每个属性都包含一个名字和一个值。属性值可以是基本类型或其他对象。在JavaScript中,对象属性有许多特性&a…...
沁恒 CH32V208(三): CH32V208 Ubuntu22.04 Makefile VSCode环境配置
目录 沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置沁恒 CH32V208(二): CH32V208的储存结构, 启动模式和时钟沁恒 CH32V208(三): CH32V208 Ubuntu22.04 Makefile VSCode环境配置 硬件部分 CH32V208WBU6 评估板WCH-LinkE 或 WCH-Link 硬件环境与Windows下…...
日撸 Java 三百行day38
文章目录 说明day381.Dijkstra 算法思路分析2.Prim 算法思路分析3.对比4.代码 说明 闵老师的文章链接: 日撸 Java 三百行(总述)_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了github上维护:https://github.com/fulisha-ok/…...
玩转肺癌目标检测数据集Lung-PET-CT-Dx ——④转换成PASCAL VOC格式数据集
文章目录 关于PASCAL VOC数据集目录结构 ①创建VOC数据集的几个相关目录XML文件的形式 ②读取dcm文件与xml文件的配对关系③创建VOC格式数据集④创建训练、验证集 本文所用代码见文末Github链接。 关于PASCAL VOC数据集 pascal voc数据集是关于计算机视觉,业内广泛…...
两种使用 JavaScript 实现网页高亮关键字的方法
随着各种类型的信息源变得越来越多,我们常常需要通过搜索引擎来找到自己需要的信息。在搜索结果中,通常会高亮显示与我们搜索的关键词相关的内容,这样我们就能更快地找到自己需要的信息。 在本文中,我们将探讨如何使用 JavaScrip…...
建设网站群的好处/aso平台
Javascript语言的执行环境是”单线程”(single thread)。 所谓”单线程”,就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。 这种模式…...
哪些社交网站做外贸比较好/海外推广解决方案
关联程序:https://github.com/lin3615/attributes 结果关系图 表之间的关系产品类型表(即产品类型表)表示,每个产品类型都会有相关的属性(即在产品类型属性表),每个产品类型属性会有多个属性值,即(产品类型属性值表).每个产品分类(即产品分类…...
做网站怎样用链接赚钱/一键优化表格
作者:Autodesk中国公司 朱小羽 在2005年全球GIS市场总体增长仅为4%的情况下,Autodesk在这一领域中仍然实现了24%的增长率,远高于所有的主要竞争对手。更具有革命性意义的是,与竞争对手不同,Autodesk地理空间产品线从…...
中国进口贸易网官网/安徽网络seo
http://projectkuto.web.fc2.com/work/kutocsveditor.html...
阿帕奇网站搭建/百度旗下产品
简介 提供一种方便、简捷、易学、易用的地图矢量、栅格数据格式\编码\坐标系转换工具。软件无需安装,硬件要求低、功能实用简洁。可以让没有任何GIS和测绘的背景的人也可以快速完成GIS数据转换和数据准备工作。从而避免在做数据转换这类最基本而简单的GIS操作时&…...
python做网站步骤/河南省郑州市金水区
当集群中所有节点都宕机后,集群再次启动后,能否自动选主1、MGR集群所有节点都宕机后,集群重启,能否自动选主和启动MGR服务这是个来自群友的问题。首先,MySQL服务利用 systemd 即可实现故障后自启动,注意下面…...