美文网首页
使用JEXL3构建规则引擎系统之通过自定义函数来丰富功能

使用JEXL3构建规则引擎系统之通过自定义函数来丰富功能

作者: 和平菌 | 来源:发表于2020-04-03 16:30 被阅读0次

需求:使用jexl3动态表达式来构建规则引擎,当遇到复杂逻辑时,需要自定义函数来扩展其功能。
场景介绍:我是在一个实时引擎里使用,收到一条MQ,我会根据配置的规则来取值或者判断是否符合条件,这时候需求要用到正则表达式,所以需要扩展jexl3。

直接看实现:
1、首先要自定义类和方法

public class UserFunction {
    /**
     *
     * @param regex 正则表达式,配置的时候提供
     * @param input 输入字符,这个是动态传入的,我配置的时候只配置字段名
     * @return
     */
    public static int regexp(String regex, String input){
        int len = 0;

        if(Tookit.isEmpty(regex) || Tookit.isEmpty(input)){
            return len;
        }

        try {
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(input);
            while(matcher.find()){
                len++;
            }
        }catch (Exception e){
            log.error("regexp error.{}", e.getMessage());
            return 0;
        }
        return len;
    }
}

2、调用

       JexlEngine jexl = new JexlBuilder().create();
        JexlContext jc = new MapContext();
        jc.set("rule", new UserFunction() );
        jc.set("input","exy123z,xy456z,1232,axy456z");
        
        //这里是配置,根据配置来调用表达式 我们可以看到第一个参数是配置的时候传进去的,而第二个参数呢是动态变量
        String express = "rule.regexp('(x)(y\\w*)(z)', input) > 0";
        JexlScript expr = jexl.createScript(express);
        System.out.println(expr.execute(jc));
     
        //结果是true

相应的可以实现其他任何的自定义函数

相关文章

网友评论

      本文标题:使用JEXL3构建规则引擎系统之通过自定义函数来丰富功能

      本文链接:https://www.haomeiwen.com/subject/ozfkphtx.html