文档章节

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

北京起航
 北京起航
发布于 2015/06/11 19:45
字数 421
阅读 149
收藏 0
点赞 0
评论 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;
        }

© 著作权归作者所有

共有 人打赏支持
北京起航
粉丝 53
博文 51
码字总数 29304
作品 0
海淀
架构师
Java中的script引擎在游戏中的使用

首先查看一下jvm当前支持了哪些脚本引擎,当前使用的是jdk6版本 ScriptEngineManager scriptEngineManager = new ScriptEngineManager();List<ScriptEngineFactory> engineFactories = scri......

ksfzhaohui ⋅ 2015/11/07 ⋅ 2

Apache Commons 常用工具包

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

K_ONE ⋅ 2016/05/04 ⋅ 0

Apache commons (Java常用工具包)简介

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

Coder小兵 ⋅ 2012/02/04 ⋅ 0

脚本编制和处理引擎--Jelly

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

匿名 ⋅ 2009/04/10 ⋅ 0

URule 2.1 发布,中式规则引擎

URule 2.1发布了。URule是一款基于RETE算法的纯Java规则引擎,提供规则集、决策表、决策树、评分卡,规则流等各种规则表现工具及基于网页的全套可视化设计器,可快速开发出各种复杂业务规则。...

youseries ⋅ 2017/11/06 ⋅ 0

Apache Commons JEXL 3.0 发布

Apache Commons JEXL 3.0 发布,此版本现已提供下载: https://commons.apache.org/jexl/downloadjexl.cgi JEXL 3.0 是个重大版本,修改了公共 JEXL API;因为二进制和源代码的不兼容,JEXL ...

叶秀兰 ⋅ 2015/12/29 ⋅ 3

表达式语言引擎--Commons JEXL

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

匿名 ⋅ 2009/03/25 ⋅ 1

Apache Commons JEXL 2.1 发布

Commons JEXL 2.1 发布了,该版本和 2.0.1 是二进制兼容的,但源码不兼容,因为新增了两个接口: - org.apache.commons.jexl2.Script - org.apache.commons.jexl2.JexlInfo JEXL 2.1 改进内容...

红薯 ⋅ 2011/12/13 ⋅ 0

【Java】Fel计算引擎学习

一、前言 最近的项目中,有一个这种需求,系统中配置很多的公式,每个公式中都会有因子。比如:,计算的时候,把这两个因子替换掉,如,,然后通过java来计算出结果。 二、实现的方式 为了解...

kisscatforever ⋅ 05/23 ⋅ 0

Apache Commons包简介

Components Description Latest Version Released BeanUtils 易于使用的包装在Java反射和内省API 1.9.2 2014-05-29 CLI 命令行参数解析 1.2 2009-03-19 Codec 一般的编码/解码算法(例如语音...

银月光海 ⋅ 2015/01/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

HiSDP —— 高效的C++软件开发平台

目前阿里集团每天有近1000PB的数据是通过LogAgent采集的,为了让LogAgent做到资源占用节省和高效采集,背后是基于HiSDP去构建的。 缘由 当决定采用C++编程语言去开发一个软件时,紧接着所面临...

阿里云云栖社区 ⋅ 1分钟前 ⋅ 0

zookeeper-3.4.12 下载与安装教程

一、zookeeper下载地址 http://mirrors.hust.edu.cn/apache/zookeeper/ 二、启动教程 把压缩包放在指定目录下 第三: 进入 conf文件夹底下 zoo_sample.cfg 文件名改成 zoo.cfg 第四步: 进入b...

泉天下 ⋅ 2分钟前 ⋅ 0

Oracle 中文日期转换

SELECT TO_date('2011年11月11日', 'yy"年"mm"月"dd"日"') FROM DUAL; 1. Oracle无法识别中文格式,所以添加双引号。 2. 后面的格式是指字符串在转换前的格式,而不是指转换后的格式。...

名侦探柯南 ⋅ 3分钟前 ⋅ 0

MySell:API Spring Boot

起步 类目 商品 订单

BeanHo ⋅ 6分钟前 ⋅ 0

Spring方法拦截器MethodInterceptor

参考资料 1、Spring方法拦截器MethodInterceptor 2、Sharding JDBC源码分析-JdbcMethodInvocation类的作用

哎小艾 ⋅ 9分钟前 ⋅ 0

正则表达式

元字符 元字符,又叫字符集,就是用一些特殊符号表示特定种类的字符或位置。 匹配字符 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 匹配...

wangchen1999 ⋅ 9分钟前 ⋅ 0

数据库数据导入Elasticsearch案例分享

基于bboss持久层和bboss elasticsearch客户端实现数据库数据导入es案例分享(支持各种数据库和各种es版本) 1.案例对应的源码 https://gitee.com/bboss/bboss-elastic/blob/master/bboss-el...

bboss ⋅ 10分钟前 ⋅ 0

动手---sbt(2)

参考 https://blog.csdn.net/leishangwen/article/details/46225587 建立一个chisel_max目录,文件内容如后面所述,现在开始执行命令: joe@joe-Aspire-Z3730:/media/sdb4/download/scala$ c......

whoisliang ⋅ 17分钟前 ⋅ 0

纯js实现最简单的文件上传(后台使用MultipartFile)

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>XMLHttpRequest上传文件</title> <script type="text/javascript"> //图片上传 var xhr......

孟飞阳 ⋅ 21分钟前 ⋅ 0

iOS宇宙大战游戏、调试工具、各种动画、AR相册、相机图片编辑等源码

iOS精选源码 日期时间选择器,swift Space Battle 宇宙大战 SpriteKit游戏源码 LLDebugTool - 便捷的IOS调试工具(新增截屏功能) 相机扫描or长按识别二维码、FMDB、键盘动态高度、定位等 动画...

sunnyaigd ⋅ 22分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部