编写不易,转载请注明(http://shihlei.iteye.com/blog/2421576)!
一 概述
Aviator 是一个Java 语言实现的表达式引擎,可以接受字符串类型的表达式,带入参数求值。
需求场景:
用户日志字段:[ip,phone,userid,action]
希望灵活组合这些字段,生成规则,比如 “1小时,userid,在ip上,触发action 100次报警”,并能灵活修改或新增。
这种需求基于Avaiator实现非常方便,实现规则引擎后,规则修改组合就不需要研发干预了。
本文基于Aviator自定义函数实现一个规则引擎的简单demo,关于读redis计数,报警等非重点仅提供空实现,重在描述思路。
依赖:
<dependency> <groupId>com.googlecode.aviator</groupId> <artifactId>aviator</artifactId> <version>3.3.0</version> </dependency>
二 简单Demo
(1)带入参数求和:
package x.expression.aviator; import java.util.HashMap; import java.util.Map; import com.googlecode.aviator.AviatorEvaluator; public class AviatorDemo { public static void main(String[] args) { String expression = "a + b + c"; Map<String, Object> params = new HashMap<>(); params.put("a", 1); params.put("b", 2); params.put("c", 3); long result = (long) AviatorEvaluator.execute(expression, params); System.out.printf("result : " + result); } }
(2)自定义函数:
Aviator 自定义函数,需要实现 com.googlecode.aviator.runtime.type.AviatorFunction , 覆盖想要的方法,然后注册即可使用;
package x.expression.aviator; import java.util.HashMap; import java.util.Map; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.runtime.function.AbstractFunction; import com.googlecode.aviator.runtime.function.FunctionUtils; import com.googlecode.aviator.runtime.type.AviatorLong; import com.googlecode.aviator.runtime.type.AviatorObject; public class AviatorSelfFunctionDemo { public static void main(String[] args) { //注册函数 AviatorEvaluator.addFunction(new MySumFunction()); String expression = "my_sum(a,b,c)"; Map<String, Object> params = new HashMap<>(); params.put("a", 1); params.put("b", 2); params.put("c", 3); long result = (long) AviatorEvaluator.execute(expression, params); System.out.printf("result : " + result); } /** * 自定义函数,实现三元数据求和 */ static class MySumFunction extends AbstractFunction { @Override public AviatorObject call(Map<String, Object> env, AviatorObject a, AviatorObject b, AviatorObject c) { Number numA = FunctionUtils.getNumberValue(a, env); Number numB = FunctionUtils.getNumberValue(b, env); Number numC = FunctionUtils.getNumberValue(c, env); long result = numA.longValue() + numB.longValue() + numC.longValue(); return new AviatorLong(result); } /** * 获取函数名 * * @return 函数名 */ public String getName() { return "my_sum"; } } }
三 规则引擎
(1)设计
业务需求:
"1小时,userid,在ip上,触发action 100次报警"
表达式设计:
"redisCount('1','hour',fields('userid,ip,action')) >= 100"
函数说明:
fields() : 获取字段,校验,生成redis key
redisCount():使用 key进行查询,获取redis中存的量且redis +1
(2)实现
package x.expression.aviator; import java.util.HashMap; import java.util.Map; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.Expression; import com.googlecode.aviator.runtime.function.AbstractFunction; import com.googlecode.aviator.runtime.function.FunctionUtils; import com.googlecode.aviator.runtime.type.AviatorLong; import com.googlecode.aviator.runtime.type.AviatorObject; import com.googlecode.aviator.runtime.type.AviatorString; public class RuleEngineDemo { public static void main(String[] args) { //注册自定义表达式函数 AviatorEvaluator.addFunction(new FieldsFunction()); AviatorEvaluator.addFunction(new RedisCountFunction()); //用户指定规则 String expression = "redisCount('1','hour',fields('userid,ip,action')) >= 100"; Expression compiledExp = AviatorEvaluator.compile(expression); //运行时收到数据 Map<String, Object> fields = new HashMap<String, Object>(); fields.put("userid", "9527"); fields.put("ip", "127.0.0.1"); fields.put("phone", "18811223344"); fields.put("action", "click"); Boolean needAlarm = (Boolean) compiledExp.execute(fields); if (needAlarm) { System.out.printf("报警"); } } static class FieldsFunction extends AbstractFunction { @Override public AviatorObject call(Map<String, Object> env, AviatorObject fieldsStrObj) { //获取可变参数 String fieldStr = fieldsStrObj.stringValue(env); String[] fields = fieldStr.split(","); StringBuilder redisKey = new StringBuilder(); System.out.println("FieldsFunction : " + fieldStr); for (String f : fields) { Object value = env.get(f); if (value != null) { redisKey.append(value.toString()); } else { //TODO 参数合法性校验 } redisKey.append(":"); } //TODO key 长多过长,会影响redis性能 return new AviatorString(redisKey.toString()); } public String getName() { return "fields"; } } static class RedisCountFunction extends AbstractFunction { @Override public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2, AviatorObject arg3) { String period = FunctionUtils.getStringValue(arg1, env); String timeUnit = FunctionUtils.getStringValue(arg2, env); String redisKey = FunctionUtils.getStringValue(arg3, env); System.out.println("FieldsFunction : " + period + " , " + timeUnit + " , " + redisKey); //TODO 读取redis int redisCount = redisGetAndIncrease(redisKey); return new AviatorLong(redisCount); } private int redisGetAndIncrease(String redisKey) { System.out.println("get redis : " + redisKey); //这里查询redis获得活动的值; return 10000; } public String getName() { return "redisCount"; } } }
相关推荐
NULL 博文链接:https://huangjiateng.iteye.com/blog/2110519
Easy Rules,Drools,Aviator表达式求值引擎,Rule Book、Oracle Rules SDK、Blaze (fico)、IBM Decision Manager,DTRules,DSL规则引擎 规则引擎由三部分 事实(Fact):已知对象,比如以上刷卡的行为,即成事实...
赠送jar包:aviator-5.2.6.jar; 赠送原API文档:aviator-5.2.6-javadoc.jar; 赠送源代码:aviator-5.2.6-sources.jar; 赠送Maven依赖信息文件:aviator-5.2.6.pom; 包含翻译后的API文档:aviator-5.2.6-javadoc-...
NULL 博文链接:https://bugyun.iteye.com/blog/2287835
java 规则引擎api使用,比如drools
git clone https://github.com/aviator/demo.git && cd demo 仔细检查您的 RVM 安装 在演示目录中,运行: rvm gemset name 输出应该是aviatordemo 。 如果不是,请查看,了解您的终端或环境所需的任何其他步骤。...
- Aviator是一个高性能、轻量级的 java 语言实现的表达式求值引擎 - Aviator简单 Maven 项目示例 - Aviator支持函数嵌套,支持自定义函数
赠送jar包:aviator-5.2.6.jar; 赠送原API文档:aviator-5.2.6-javadoc.jar; 赠送源代码:aviator-5.2.6-sources.jar; 赠送Maven依赖信息文件:aviator-5.2.6.pom; 包含翻译后的API文档:aviator-5.2.6-javadoc-...
Aviator是一个高性能、轻量级的基于java实现的表达式引擎,它动态地将String类型的表达式编译成Java ByteCode并交给JVM执行。 Aviator支持所有的关系运算符和算术运算符,不支持位运算,同时支持表达式的优先级,...
aviator 表达式解析 aviator 表达式解析 aviator 表达式解析
赠送jar包:aviator-5.1.4.jar; 赠送原API文档:aviator-5.1.4-javadoc.jar; 赠送源代码:aviator-5.1.4-sources.jar; 赠送Maven依赖信息文件:aviator-5.1.4.pom; 包含翻译后的API文档:aviator-5.1.4-javadoc-...
Aviator——轻量级Java表达式求值引擎,这个是下载下来的jar包,版本是4.1.2
开源轻量级、高性能的表达式求值器 Aviator 2.3.0 包含Aviator-2.3.0用户指南,aviator-2.3.2-bin-with-dependencies等
非常好用的计算引擎,有非常多的的计算方法满足所需的数学计算
赠送jar包:aviator-5.1.4.jar; 赠送原API文档:aviator-5.1.4-javadoc.jar; 赠送源代码:aviator-5.1.4-sources.jar; 赠送Maven依赖信息文件:aviator-5.1.4.pom; 包含翻译后的API文档:aviator-5.1.4-javadoc-...
set ScriptEngineFactory.getLanguageName return aviator by @qiukeren in #525 Improve class cache performance when class not found by @jiudc in #522 fix: capitalize java bean property names by @killme...
Aviator规范,使用手册,告诉你怎么用
主要是Google放开的java源码,针对java的自定义的表达式实现,比如说实现¥¥¥&&&||||与逻辑或的实现源码,1、进行表达式解析,获取里面的单引号参数,然后解析成表达式入参,2、逻辑运算的加减乘除的实现逻辑,...
Aviator是一个轻量级、高性能的Java表达式执行引擎,它动态地将表达式编译成字节码并运行。
google开发的开源表达式计算项目 ,支持自定义函数与函数嵌套 , 具有很高的运算效率