文档章节

jexl表达式解析、计算工具类.md

北京起航
 北京起航
发布于 2015/06/11 19:45
字数 421
阅读 192
收藏 0

jexl表达式解析、计算工具类.md 根据表达式可以动态反向解析出变量;适合动态表达式,参数未知场景 如 (A0.2+B0.8)/C 解析出 A\B\C,把ABC参数值代入计算 初始化引擎

private static final JexlEngine ENGINE = new JexlEngine();
static {
    ENGINE.setCache(512);
    ENGINE.setLenient(false);
    ENGINE.setSilent(false);
}

解析出表达式中的变量 ExpressionUtils

package com.its.cloud.utils;
 
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
 
import org.apache.commons.jexl2.Expression;
import org.apache.commons.jexl2.ExpressionImpl;
import org.apache.commons.jexl2.JexlEngine;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import java.util.Collections;
import java.util.List;
import java.util.Set;
 
/**
* Created by hongliangpan@gmail.com on 2015/1/19.
*/
public class ExpressionUtils {
 
    private static final Logger LOGGER = LoggerFactory.getLogger(ExpressionUtils.class);
    private static final JexlEngine JEXL = new JexlEngine();
 
    static {
        JEXL.setCache(512);
        JEXL.setLenient(false);
        JEXL.setSilent(false);
    }
 
    public static JexlEngine getJexlEngine() {
        return JEXL;
    }
 
    public static boolean isValidExpression(String expression) {
        try {
            JEXL.createExpression(expression);
            return true;
        } catch (Throwable t) {
            LOGGER.error("表达式{}配置错误{}。", expression, t.getMessage(), t);
            return false;
        }
    }
 
    /**
     * 获取表达式中的变量参数
     *
     * @param expression 表达式,如 ping.max>0 and ping.min>0 and pin.lost==0
     */
    public static List<String> getVariables(String expression) {
        Expression exp;
        try {
            exp = JEXL.createExpression(expression);
        } catch (Throwable t) {
            LOGGER.error("表达式{}配置错误{}。", expression, t.getMessage(), t);
            return Collections.emptyList();
        }
        return getVariables(exp);
    }
 
    public static List<String> getVariables(Expression exp) {
        List<String> metricDefIds = Lists.newArrayList();
        Set<List<String>> variables = JEXL.getVariables((ExpressionImpl) exp);
        for (List<String> var : variables) {
            metricDefIds.add(Joiner.on(".").join(var));
        }
        return metricDefIds;
    }
}

解析变量,调用示例

jexl反向解析表达式中的变量
JexlEngine jexl = new JexlEngine();
String threshold = "(value==3)and (cpu>90 and mem <70)";
Expression exp = jexl.createExpression(threshold);

List<String> variables = jexl.getVariables(((ExpressionImpl)exp));

表达式示例

String threshold = "value>90";
        Expression exp = getJexlEngine().createExpression(threshold);
        JexlContext jc = new MapContext();
        jc.set("value", data.getValue());
        Object evaluate = exp.evaluate(jc);
        if (evaluate instanceof Boolean) {
            return (boolean) evaluate;
        } else {
            LOGGER.error("表达式错误{},不是boolean返回值;{}", exp, rule);
            return false;
        }

© 著作权归作者所有

共有 人打赏支持
北京起航
粉丝 55
博文 52
码字总数 29304
作品 0
海淀
架构师
私信 提问
第三章——jXLS Excel标记

jXLS的Excel标记分为3种: Bean属性标记 区域标记 命令标记 jXLS提供XlsCommentAreaBuilder类从Excel单元格注释读取标记。XlsCommentAreaBuilder实现通用AreaBuilder接口。AreaBuilder接口如...

Leech
07/13
0
0
Apache Commons 常用工具包

Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问http://jakarta.apache.org/commons/index.html BeanUtils Commons-BeanUtils 提供对 Java...

K_ONE
2016/05/04
108
0
脚本编制和处理引擎--Jelly

Jelly 是一种基于 Java 技术和 XML 的脚本编制和处理引擎。Jelly 的特点是有许多基于 JSTL (JSP 标准标记库,JSP Standard Tag Library)、Ant、Velocity 及其它众多工具的可执行标记。Jelly...

匿名
2009/04/10
2.6K
0
Apache commons (Java常用工具包)简介

Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问http://jakarta.apache.org/commons/index.html BeanUtils Commons-BeanUtils 提供对 Java...

Coder小兵
2012/02/04
0
0
表达式语言引擎--Commons JEXL

Java Expression Language (JEXL) 是一个表达式语言引擎,可以用来在应用或者框架中使用。JEXL 受Velocity 和 JSP 标签库 1.1 (JSTL) 的影响而产生的。需要注意的是, JEXL 并不时 JSTL 中的...

匿名
2009/03/25
8.1K
1

没有更多内容

加载失败,请刷新页面

加载更多

CentOS配置Tomcat监听80端口,虚拟主机

Tomcat更改默认端口为80 更改的配置文件是: /usr/local/tomcat/conf/server.xml [root@test-a ~]# vim /usr/local/tomcat/conf/server.xml # 找到 Connector port="8080" protocol="HTTP/1......

野雪球
今天
4
0
《稻盛和夫经营学》读后感心得体会3180字范文

《稻盛和夫经营学》读后感心得体会3180字范文: 一代日本经营之圣稻盛和夫凭借刻苦勤奋的精神以及深植于佛教的商业道德准则,成为了“佛系”企业家的代表人物。在《稻盛和夫经营学》“领导人...

原创小博客
今天
3
0
java框架学习日志-5(常见的依赖注入)

依赖注入(dependency injection) 之前提到控制反转(Inversion of Control)也叫依赖注入,它们其实是一个东西,只是看的角度不同,这章详细说一下依赖注入。 依赖——指bean对象创建依赖于...

白话
今天
4
0
红外接收器驱动开发

背景:使用系统的红外遥控软件没有反应,然后以为自己接线错误,反复测试,结果烧坏了一个红外接收器,信号主板没有问题。所以自己开发了一个红外接收器的python驱动。接线参见https://my.os...

mbzhong
今天
2
0
ActiveMQ消息传送机制以及ACK机制详解

AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的。 一. ActiveMQ消息传送机...

watermelon11
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部