`
阅读更多

 

编写不易,转载请注明(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";
        }
    }
}

 

 

1
0
分享到:
评论

相关推荐

    Aviator 之规则引擎

    **Aviator 规则引擎详解** Aviator 是一个开源的Java表达式执行引擎,它主要用于实现复杂的业务逻辑和规则计算。作为一个轻量级的规则引擎,Aviator 提供了一种简洁而强大的方式来处理动态计算和决策过程。本文将...

    springboot ice规则引擎

    Easy Rules,Drools,Aviator表达式求值引擎,Rule Book、Oracle Rules SDK、Blaze (fico)、IBM Decision Manager,DTRules,DSL规则引擎 规则引擎由三部分 事实(Fact):已知对象,比如以上刷卡的行为,即成事实...

    java规则引擎

    基于规则的专家系统(RBES)是规则引擎的基础,它包括规则库(Rule Base)、工作内存(Working Memory)和推理引擎(Inference Engine)。推理引擎由模式匹配器、议程(Agenda)和执行引擎组成,负责根据事实或目标...

    Drools规则引擎技术分享

    与其他规则引擎相比,如jRules、ODM和Aviator,Drools具有开源、高性能和强大的规则定义能力等特点,适合处理复杂规则和业务流程。 总之,Drools规则引擎提供了一种高效、灵活的方式来管理和执行业务规则,使得业务...

    aviator-5.2.6-API文档-中文版.zip

    赠送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-5.1.4-API文档-中英对照版.zip

    赠送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-...

    google-aviator.jar

    在实际应用中,Aviator常被用于日志分析、脚本编写、规则引擎等领域。例如,通过Aviator,开发者可以轻松地在日志分析系统中构建复杂的查询条件,或者在业务规则引擎中定义动态的决策逻辑。此外,Aviator还支持变量...

    avitator个版本jar包、pdf学习手册

    Aviator的核心功能在于它的表达式引擎。这个引擎支持丰富的运算符,包括算术运算(如加减乘除)、比较运算(如大于、小于、等于)、逻辑运算(如与、或、非),以及字符串操作和数组处理等。它还支持自定义函数,使...

    Java表达式引擎Aviator.zip

    Aviator是一个高性能、轻量级的基于java实现的表达式引擎,它动态地将String类型的表达式编译成Java ByteCode并交给JVM执行。 Aviator支持所有的关系运算符和算术运算符,不支持位运算,同时支持表达式的优先级,...

    AviatorDemo.zip

    通过学习和实践`AviatorDemo`,开发者可以深入了解Aviator的用法,并将其应用到自己的项目中,解决动态计算和规则引擎的需求。同时,理解函数嵌套和自定义函数的机制,对于提高代码的灵活性和复用性至关重要。

    Aviator是一个高性能java表达式求值程序

    1. **动态规则引擎**:在业务规则频繁变动的场景下,如信贷审批、保险核保等,可以用Aviator构建动态规则引擎。 2. **日志分析**:在大数据分析中,Aviator可以用来快速评估日志数据,提取关键信息。 3. **配置...

    Aviator 2.3.0

    在实际应用中,Aviator常用于动态规则评估、数据过滤、业务逻辑计算等场景。例如,在大数据处理中,它可以用来快速评估复杂的数据筛选条件;在服务器端,它可以作为模板引擎,动态生成个性化内容。 总的来说,...

    aviator 实现 List 的求和、排序、最大、最小值

    Aviator 是一个强大的 Java 表达式执行引擎,它允许你在运行时动态计算表达式,类似于 JavaScript 或者其他脚本语言。在Java应用中,Aviator 特别适合用于数据分析和处理,例如对 List 中的数据进行求和、排序、找出...

    demo:使用 Aviator gem 的演示应用程序

    git clone https://github.com/aviator/demo.git && cd demo 仔细检查您的 RVM 安装 在演示目录中,运行: rvm gemset name 输出应该是aviatordemo 。 如果不是,请查看,了解您的终端或环境所需的任何其他步骤。...

    aviator 表达式解析

    Aviator是一个高性能、轻量级的Java语言实现的表达式求值引擎,主要用于各种表达式的动态求值。它的设计目标是轻量级和高性能,相比于Groovy、JRuby等语言,Aviator非常小,即使加上依赖包也只有450K,不加依赖包更...

    aviator-5.1.4-API文档-中文版.zip

    赠送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-5.2.6-API文档-中英对照版.zip

    赠送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-2.3.2.jar

    非常好用的计算引擎,有非常多的的计算方法满足所需的数学计算

    aviator-4.1.2.jar

    Aviator——轻量级Java表达式求值引擎,这个是下载下来的jar包,版本是4.1.2

    Aviator-2.3.0用户指南

    相较于Groovy或JRuby等更为复杂的脚本语言,Aviator的体积更小(加上所有依赖包仅450KB,若不计依赖包则仅有70KB),同时提供了一种介于复杂脚本语言与极简表达式引擎之间的平衡方案。 Aviator并非一种完整的编程...

Global site tag (gtag.js) - Google Analytics