aviator实战

article/2025/10/23 23:59:31

aviator规则引擎轻量、高性能可以帮我们解决很多配置规则的问题
官方文档参考:Aviator帮助文档

实战一把aviator,举个栗子

对年龄在40岁以内、职级大于等于3的“宋姓”销售人员发放提成,
提成计算公式=“销售量 * 单件提成金额 * 10%”

代码设计:

在这里插入图片描述

上述逻辑抽象出两个规则表达式:

"age <= 40 && clazz >= 3 && string.startsWith(name, '宋')"
"salNum * bonus * 10/100"

将两个规则表达式编织成规则chain,顺序执行,上代码

增加pom依赖
<dependency><groupId>com.googlecode.aviator</groupId><artifactId>aviator</artifactId><version>4.1.2</version>
</dependency>
interface:规则chain
public interface RuleChain {/**** 匹配规则表达式chain* @param context* @param response:表达式执行结果*/void matchRule(AviatorContext context, List<AbstractAviatorRule> response);
}

核心类

class:规则chain接口默认实现类
public class DefaultRuleChain implements RuleChain {// 规则列表private List<AbstractAviatorRule> rules;// 规则列表当前索引private int position = 0;public DefaultRuleChain(List<AbstractAviatorRule> rules){this.rules = rules;}@Overridepublic void matchRule(AviatorContext context, List<AbstractAviatorRule> response) {while(rules != null && position < rules.size()){rules.get(position++).execute(context, this, response);}}
}
class:抽象规则
@Data
public abstract class AbstractAviatorRule {// 规则id主键private Long ruleId;// 规则表达式private String expression;// 表达式执行结果private AviatorResult result;/**** 执行规则表达式* @param param* @param ruleChain* @param response:表达式执行结果对象*/public abstract void execute(AviatorContext param, List<AbstractAviatorRule> response);
}
class:抽象规则默认实现,返回值boolean
@Slf4j
public class DefaultAviatorRule extends AbstractAviatorRule {@Overridepublic void execute(AviatorContext param, List<AbstractAviatorRule> response) {super.setResult(executeAndResult(param));response.add(this);}protected AviatorResult executeAndResult(AviatorContext param){AviatorResult resultInfo = new AviatorResult();try {boolean result = AviatorExecutor.execute(param, super.getExpression());resultInfo.setSuccess(result);}catch (Exception e){log.error("DefaultAviatorRule execute error: {}", e);}return resultInfo;}
}
class:默认规则子类计算型规则,返回值Double
@Slf4j
public class CalculatorAviatorRule extends DefaultAviatorRule {@Overrideprotected AviatorResult executeAndResult(AviatorContext param){AviatorResult resultInfo = new AviatorResult();try {Double result = AviatorExecutor.execute(param, super.getExpression());resultInfo.setSuccess(true);resultInfo.setResult(result);}catch (Exception e){log.error("CalculatorAviatorRule execute error: {}", e);}return resultInfo;}
}
class:aviator执行器
public class AviatorExecutor {public static <T> T execute(AviatorContext context, String expression){Map<String, Object> param = AviatorContext.buildMap(context);return (T) AviatorEvaluator.execute(expression, param, true);}
}

辅助类

@Data
public class AviatorContext {@AviatorProperty("姓名")private String name;@AviatorProperty("年龄")private Integer age = 0;@AviatorProperty("职级")private Integer clazz = 0;@AviatorProperty("提成")private Double bonus;@AviatorProperty("销售数量")private Integer salNum;/**** 将对象转为Map* @param context* @return*/public static Map<String, Object> buildMap(AviatorContext context){Map<String, Object> env = new HashMap<>();if(null == context){return env;}List<Field> fieldList = new ArrayList<>();Class clz = context.getClass();int deep = 0;while(deep < 5 && null != clz){fieldList.addAll(new ArrayList<>(Arrays.asList(clz.getDeclaredFields())));clz = clz.getSuperclass();deep++;}for(Field field : fieldList){try {PropertyDescriptor property = new PropertyDescriptor(field.getName(), context.getClass());Method method = property.getReadMethod();env.put(field.getName(), method.invoke(context));} catch (Exception e) {e.printStackTrace();}}return env;}
}
@Data
public class AviatorResult {private boolean success;private Object result;public AviatorResult(){}public AviatorResult(boolean success){this(success, null);}public AviatorResult(boolean success, Object result){this.success = success;this.result = result;}
}

测试类

class TestMain{public static void main(String[] args) {// aviator上下文AviatorContext context = buildContext();// 存储表达式执行结果List<AbstractAviatorRule> response = new ArrayList<>();// 规则chainRuleChain ruleChain = new DefaultRuleChain(rules());ruleChain.matchRule(context, response);System.out.println(JSON.toJSONString(response));}private static AviatorContext buildContext(){AviatorContext context = new AviatorContext();context.setName("宋小宝");context.setAge(35);context.setClazz(3);context.setBonus(10d);context.setSalNum(20);return context;}private static List<AbstractAviatorRule> rules(){AbstractAviatorRule rule1 = new DefaultAviatorRule();rule1.setRuleId(1001l);rule1.setExpression("age <= 40 && clazz >= 3 && string.startsWith(name, '宋')");AbstractAviatorRule rule2 = new CalculatorAviatorRule();rule2.setRuleId(1002l);rule2.setExpression("salNum * bonus * 10/100");List<AbstractAviatorRule> rules = new ArrayList<>();rules.add(rule1);rules.add(rule2);return rules;}
}
执行结果
[{"expression": "age <= 40 && clazz >= 3 && string.startsWith(name, '宋')","result": {"success": true},"ruleId": 1001
}, {"expression": "salNum * bonus * 10/100","result": {"result": 20.0,"success": true},"ruleId": 1002
}]

结语

核心设计其实就是将多个规则加入RuleChain中串行执行,并输出执行结果,业务基于执行结果做下一步操作,可以对一串规则做与(所有规则都满足)、或(只要有一个规则满足)的逻辑。

获取源码请点击


http://chatgpt.dhexx.cn/article/L15FRCEA.shtml

相关文章

aviator java,基于Aviator的规则引擎系统设计

项目里或多或少的都会有一些基于规则判断的代码&#xff0c;而往往这部分逻辑判断代码都写在项目里&#xff0c;改规则就得改代码&#xff0c;所以就很不方便&#xff0c;而且随着规则越多&#xff0c;代码越繁杂。 最近有时间&#xff0c;设计了一套基于Aviator的规则引擎系统…

Aviator源码:Aviator表达式引擎执行过程源码分析

目录 1.if执行脚本示例 2.源码分析 2.1 compile执行过程 2.1.1 CodeGenerator 2.1.2 ExpressionParser 2.1.3 if脚本ASM反编译结果 2.2 compiledExpression.execute执行过程 3.总结概述 由于Aviator支持的脚本语法较多&#xff0c;下面通过项目中使用较多的if语句来对a…

Aviator使用

“初步了解和使用Aviator” 1.Aviator简介 Aviator 是一个高性能&#xff0c;轻量级的java语言实现的表达式求值引擎&#xff0c;主要用于各种表达式的动态求值。 官方文档 github地址 支持数字、字符串、正则表达式、布尔值、正则表达式等基本类型&#xff0c;完整支持所有…

java aviator_Aviator 表达式求值引擎开源框架

简介 Aviator是一个高性能、轻量级的java语言实现的表达式求值引擎&#xff0c;主要用于各种表达式的动态求值。现在已经有很多开源可用的java表达式求值引擎&#xff0c;为什么还需要Avaitor呢&#xff1f; Aviator的设计目标是轻量级和高性能&#xff0c;相比于Groovy、JRuby…

java aviator_Aviator——让表达式飞起来

《飞行大亨》是我很喜欢的一部电影&#xff0c;不过这里我想介绍的是一个叫Aviator的开源的Java表达式求值器。 一、轮子的必要性 表达式的求值上&#xff0c;java的选择非常多&#xff0c;强大的如Groovy、JRuby&#xff0c;N年没维护的beanshell&#xff0c;包括javaeye上朋友…

Aviator

Aviator 简介 Aviator是一个高性能、轻量级的java语言实现的表达式求值引擎&#xff0c;主要用于各种表达式的动态求值。现在已经有很多开源可用的java表达式求值引擎&#xff0c;为什么还需要Avaitor呢&#xff1f; Aviator的设计目标是轻量级和高性能 &#xff0c;相比于Groo…

Aviator介绍

Aviator简介 Aviator是一个高性能、轻量级的 java 语言实现的表达式求值引擎, 主要用于各种表达式的动态求值。现在已经有很多开源可用的 java 表达式求值引擎,为什么还需要 Avaitor 呢? Aviator的设计目标是轻量级和高性能,相比于Groovy、JRuby的笨重, Aviator非常小, 加上…

西电计算机学院名誉院长,杨孟飞院士受聘为西电计科院名誉院长及讲席教授

西电新闻网讯(通讯员 陈龙)12月21日上午&#xff0c;西安电子科技大学计算机科学与技术学院名誉院长杨孟飞院士“华山学者”讲席教授及战略咨询委员会委员聘任仪式在北校区主楼Ⅱ区319会议室举行&#xff0c;校长杨宗凯、副校长王泉参加仪式。仪式由计科院执行院长崔江涛主持。…

北航计算机学院新闻,澳门理工学院代表团访问我校计算机学院

北航新闻网1月21日电(通讯员 盛浩)2019年1月16日&#xff0c;澳门理工学院副院长李雁莲教授、孙毓奇教授等一行三人到北航计算机学院就双方合作等事项进行交流。 座谈会由先进计算机应用技术教育部工程研究中心熊璋教授主持&#xff0c;计算机学院副院长胡春明副教授、中心李超…

【华人学者风采】陈晓峰 西安电子科技大学

【华人学者风采】陈晓峰&#xff0c;西安电子科技大学网络与信息安全学院副院长。研究方向包括公钥密码学、金融密码学、云计算安全、数据安全、区块链技术及应用、人工智能安全。曾获荣誉&#xff1a; 国家万人计划科技创新领军人才&#xff0c;教育部“青年长江学者” &#…

港科资讯 | 倪明选校长等出席江门“双碳”实验室揭牌暨项目签约仪式

12月7日&#xff0c;由香港科技大学&#xff08;广州&#xff09;&#xff08;筹&#xff09;和江门市政府发起共建的江门“双碳”实验室举行了揭牌暨项目签约仪式&#xff0c;江门双碳实验室正式启动成立。香港科技大学&#xff08;广州&#xff09;&#xff08;筹&#xff09…

莫队算法(普通莫队、带修莫队、树上莫队、不删除莫队)学习笔记【理解+套路/核心代码+例题及题解】

一、理解 我的理解就是巧妙的暴力&#xff0c;利用双指针以及分块思想&#xff0c;巧妙的移动双指针&#xff0c;时间复杂度可以达到O(NlogN)。 强推博客&#xff1a;写的又好又全。链接 二、套路 1、普通莫队 【1】核心代码 bool cmp(node a,node b){return belong[a.l]…

香港理工大学计算机系石杰明老师组招收全奖博士生、博士后

来源&#xff1a;AI求职 香港理工大学 香港理工大学位于中国香港特别行政区&#xff0c;QS 最新排名世界 66 位。计算机系&#xff08;Department of Computing&#xff09;USNews CS 排名 36&#xff0c;泰晤士 CS 排名 79。 石杰明博士课题组成员包括有 985/211 顶尖高校背景…

【调剂】华侨大学计算机学院计算机视觉与模式识别实验室钟必能课题组研究生招生...

点击文末的阅读原文或者公众号界面左下角的调剂信息或者公众号回复“调剂”是计算机/软件等专业的所有调剂信息集合&#xff0c;会一直更新的。 课题组主页&#xff1a;https://cst.hqu.edu.cn/info/1109/2001.htmLinkedin: https://www.linkedin.com/in/bineng-zhong-71a36674…

莫队算法思想

目录 莫队算法普通莫队方法&#xff1a;主要代码结构&#xff1a;例题&#xff1a;小B的询问例题&#xff1a;小Z的袜子奇偶化排序 带修改的莫队小结&#xff1a; 莫队算法 莫队算法是由前国家队莫涛提出的一种算法&#xff0c;主要应用在一类离线区间查询的问题中&#xff0c…

【华人学者风采】冯佳时 新加坡国立大学

【华人学者风采】冯佳时&#xff0c;新加坡国立大学ECE系助理教授。本科毕业于中国科学技术大学&#xff0c;硕士毕业于中国科学院自动化研究所&#xff0c;博士毕业于新加坡国立大学。研究兴趣包括大污染数据分析&#xff0c;在线和分布式鲁棒性学习及其在对象识别中的应用。 …

港科夜闻|央视网专访香港科大(广州)(筹)校长倪明选教授,谈香港科技大学在科研及知识转移方面成就...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、央视网专访香港科大(广州)(筹)校长倪明选教授&#xff0c;谈香港科技大学在科研及知识转移方面成就。香港科技大学(广州)(筹)校长倪明选教授接受央视网专访&#xff0c;谈香港科技大学在科研及知识转移方面取得的成就&am…

独家对话许诗军:数字化转型,最基本的是不去拒绝 |数字价值观察室(下)...

关注ITValue&#xff0c;看企业级最新鲜、最价值报道&#xff01; ▎本文摘自《云栖战略参考》&#xff0c;这本刊物由阿里云与钛媒体联合策划。目的是为了把各个行业先行者的技术探索、业务实践呈现出来&#xff0c;与思考同样问题的“数字先行者”共同探讨、碰撞&#xff0c;…

港科夜闻|香港科技大学(广州)(筹)校长倪明选教授在北京拜访国家教育部党组书记、部长怀进鹏...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科技大学(广州)(筹)校长倪明选教授在北京拜访国家教育部党组书记、部长怀进鹏。2021年11月1日&#xff0c;香港科技大学(广州)(筹)校长倪明选教授等一行在北京拜访国家教育部党组书记、部长怀进鹏。 2、深圳先进院与…

特么的. 最终把 amobbs 的站长阿莫(莫进明)给回骂了一顿.

起因: 假设你居住的地方&#xff0c;要上马PX等高污染的项目&#xff0c;你会怎么做. 鼓动别人上街暴力示威与军警对抗. 自己待在家里支持怂恿. 这样的人真心猥琐! 鉴于他常常私自改动帖子, 在此截图留存. 真特么没劲. 居然以封锁别人 ID 作为别人"打不还手骂不还口…