【脚本】JAVA 执行 阿里QLExpress 动态脚本 demo 进阶版 增加项目灵活性

【脚本】JAVA 执行 阿里QLExpress 脚本 demo 进阶版

测试demo


import com.ql.util.express.DefaultContext;public class QlExpressTest {public static void main(String[] args) throws Exception {QLExpressManager qlExpressManager = new QLExpressManager();DefaultContext<String, Object> context = new DefaultContext<>();//阈值1000context.put("threshold", 1000);context.put("name", "orderMoney");context.put("channelType", "mobile");context.put("type", 1);String qlExpress = " 1>0?1:0 ";Object result = qlExpressManager.execute(qlExpress, context);System.out.println(result);}
}

实际用法

    @Resourceprivate QLExpressManager qlExpressManager;String 脚本 = " 1 + 1"Object execute = qlExpressManager.execute(脚本, dataMap);

package com.common.qlexpress;import java.math.BigDecimal;/*** 规则处理器接口**/
public interface AbstractRuleHandler extends RuleHandler {/*** 根据渠道创意查询*/BigDecimal doHandler(Integer type, String channelType);
}

import org.springframework.stereotype.Component;import java.math.BigDecimal;@Component
public class OrderMoneyHandler implements AbstractRuleHandler {@Override@QlRule(methodName = "doHandler", desc = "订单金额统计查询")public BigDecimal doHandler(Integer type, String channelType) {return null;}
}

import com.ql.util.express.IExpressContext;
import org.springframework.context.ApplicationContext;import java.util.HashMap;
import java.util.Map;/*** QLExpress 上下文定义类**/
public class QLExpressContext extends HashMap<String, Object> implements IExpressContext<String, Object> {private ApplicationContext applicationContext;public QLExpressContext(Map<String, Object> properties, ApplicationContext context) {super(properties);this.applicationContext = context;}@Overridepublic Object get(Object name) {Object result;result = super.get(name);try {if (result == null && this.applicationContext != null && this.applicationContext.containsBean((String) name)) {result = this.applicationContext.getBean((String) name);}} catch (Exception e) {throw new RuntimeException(e);}return result;}@Overridepublic Object put(String name, Object object) {super.put(name, object);return object;}
}

import com.ql.util.express.ExpressRunner;
import com.ql.util.express.IExpressContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;import java.lang.reflect.Method;
import java.util.Collections;
import java.util.Map;/*** QLExpress 管理器**/
@Slf4j
@Component
public class QLExpressManager implements InitializingBean, ApplicationContextAware {private ExpressRunner runner = new ExpressRunner(false, false);;private ApplicationContext applicationContext;public Object execute(String statement, Map<String, Object> context) throws Exception {IExpressContext expressContext = new QLExpressContext(context != null ? context : Collections.EMPTY_MAP, applicationContext);return runner.execute(statement, expressContext, null, true, false);}@Overridepublic void afterPropertiesSet() throws Exception {runner.addOperatorWithAlias("大于", ">", null);runner.addOperatorWithAlias("小于", "<", null);runner.addOperatorWithAlias("等于", "==", null);runner.addOperatorWithAlias("大于等于", ">=", null);runner.addOperatorWithAlias("小于等于", "<=", null);Map<String, RuleHandler> beanMap = applicationContext.getBeansOfType(RuleHandler.class);beanMap.values().forEach(bean -> {Method[] methods = bean.getClass().getDeclaredMethods();for (Method method : methods) {QlRule qlRule = method.getAnnotation(QlRule.class);if (qlRule == null) {continue;}try {runner.addFunctionOfClassMethod(qlRule.methodName(), bean.getClass().getName(), method.getName(),method.getParameterTypes(), null);} catch (Exception ex) {log.error("runner.addFunctionOfClassMethod", ex);}}});}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}
}

import java.lang.annotation.*;/*** QLRule 注解,Spring启动时扫描**/
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface QlRule {/*** 方法名称*/String methodName();/*** 方法描述*/String desc() default "";
}

/*** 规则处理器**/
public interface RuleHandler {
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/817848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果个人证书管理

根据近日工业和信息化部发布的《工业和信息化部关于开展移动互联网应用程序备案工作的通知》&#xff0c;相信不少要进行IOS平台App备案的朋友遇到了一个问题&#xff0c;就是apple不提供云管理式证书的下载&#xff0c;也就无法获取公钥及证书SHA-1指纹。 已经上架的应用不想重…

瑞芯微RK3568/RK3588+鸿蒙,矿鸿工控屏、矿鸿工控板、矿鸿网关,推动矿业数智化变革

4月10日至12日&#xff0c;以“绿色智能创新&#xff0c;携手共赢未来”为主题的第二届中国国际矿业装备与技术展览会在西安举行。信迈科技携矿鸿解决方案及产品亮相&#xff0c;赋能矿山行业数智化升级和国产化改造进程全面提速。 作为华为矿山军团矿鸿生态使能合作伙伴&#…

【位运算】3097. 或值至少为 K 的最短子数组 II

本文涉及知识点 位运算 LeetCode3097. 或值至少为 K 的最短子数组 II 给你一个 非负 整数数组 nums 和一个整数 k 。 如果一个数组中所有元素的按位或运算 OR 的值 至少 为 k &#xff0c;那么我们称这个数组是 特别的 。 请你返回 nums 中 最短特别非空 子数组 的长度&…

数据可视化-ECharts Html项目实战(10)

在之前的文章中&#xff0c;我们学习了如何在ECharts中编写雷达图&#xff0c;实现特殊效果的插入运用&#xff0c;函数的插入&#xff0c;以及多图表雷达图。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&…

国内免费中文版ChatGPT网站入口(2024/4/15)

首先向大家介绍一些基本信息&#xff1a;ChatGPT3.5在官方网站上是可以免费使用的&#xff0c;而ChatGPT4.0则采取按月收费的模式&#xff0c;价格为20美元&#xff08;约合140元人民币&#xff09;。因此&#xff0c;所谓的免费使用主要指的是GPT3.5。如果有人声称GPT4.0也是免…

vite+vue3+antDesignVue 记录-持续记录

记录学习过程 持续补充 每天的学习点滴 开始时间2024-04-12 1&#xff0c;报错记录 &#xff08;1&#xff09;env.d.ts文件 解决方法&#xff1a; 在env.d.ts文件中添加以下代码&#xff08;可以看一下B站尚硅谷的讲解视频&#xff09; declare module *.vue {import { Defi…

关于centos8自带的apache2.4开启https后,XP系统的IE8无法显示网页的问题

经检验&#xff0c;是因为系统的apache和openssl版本太高导致的。 禁用系统默认的apache2.4&#xff0c;自己重新源码编译安装一套openssl-1.0.1fapache2.2.23php7.1.2即可。跟update-crypto-policies没有关系&#xff0c;可保持默认的DEFAULT状态。 关于centos8自带的apache2…

数据结构从入门到实战——顺序表

目录 前言 一、顺序表的概念及结构 1.1 线性表 二、顺序表分类 三、动态顺序表的实现 3.1 顺序表结构的创建以及初始化 3.2 顺序表的销毁 3.3 顺序表的打印 3.4 尾插数据 ——最困难的 3.5 头插数据 3.6 尾删数据 3.7 头部删除数据 前言 在计算机科学和数据结…

不饱和脂肪酸的综述

1.概述 不饱和脂肪酸是一类脂肪酸&#xff0c;其碳链上存在双键&#xff08;不饱和键&#xff09;。根据双键的数量和位置&#xff0c;不饱和脂肪酸可以进一步分为以下两类&#xff1a; 单不饱和脂肪酸&#xff08;Monounsaturated fatty acids&#xff0c;简称MUFA&#xff0…

excel添加折线图,如何将日期作为横坐标?

就这么两列数据&#xff0c;想添加一个以日期为横坐标的折线图&#xff0c;但是出来的折线是这个样子&#xff0c;切换行/列也不行&#xff0c;怎么办呢&#xff1f; 实际上这个折线图中包括两条折线&#xff0c;蓝色的是日期的折线&#xff0c;橙色的是时间的折线&#xff0c;…

夜月一帘幽梦,春风十里“三指针法“ (链表面试题篇2)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能接…

第 6 章 URDF、Gazebo与Rviz综合应用(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 6.7 URDF、Gazebo与Rviz综合应用 关于URDF(Xacro)、Rviz 和 Gazebo 三者的关系&#xff0c;前面已有阐述&…

无人机三维建模对光伏测绘的影响有多大?

在光伏电站建设前期阶段&#xff0c;需要对选址地点进行测绘&#xff0c;人工测绘容易出现数据不准确、信息共享不畅等缺陷。随着科技的快速发展以及无人机技术的不断提升&#xff0c;许多光伏企业选择借助无人机进行测绘工作&#xff0c;快速生成三维建模&#xff0c;提高测绘…

虚拟内存映像

最下面是固定的内容&#xff0c; bss放未初始化的变量、data是初始化的、text是代码内容&#xff0c; stack放寄存器放不下的局部变量&#xff0c; heap就是用户控制的地方&#xff0c;栈由编译器控制。 为什么寄存器也不能很多&#xff1f; 因为寄存器寻址也要编码&#…

ATFX港股:长周期看,恒生指数报价已经回到2008年以来的底部区域

消息面&#xff1a; 1、 4月12日&#xff0c;官方发布《推动资本市场高质量发展的若干意见》文件&#xff0c;其中提到九条意见&#xff0c;被称为“国九条”&#xff0c;重要内容有&#xff1a;将上市前突击“清仓式”分红等情形纳入发行上市负面清单&#xff1b;推动一年多次…

less+rem+媒体查询布局(主流)

rem适配布局 一.rem基础二.媒体查询1.概念2.语法&#xff08;1&#xff09;.mediatype查询类型&#xff08;2&#xff09;.关键字&#xff08;3&#xff09;.媒体特性&#xff08;4&#xff09;.应用 3.媒体查询rem实现元素动态大小变化4.引入资源&#xff08;针对不同媒体查询…

完全免费、私有且本地运行的搜索聚合器FreeAskInternet原理解读

我们在百度搜索,会出现如下回答方式,如何实现的呢?让我们看看一个完全免费、私有且本地运行的搜索聚合器FreeAskInternet的实现原理吧。 一.功能介绍 FreeAskInternet 是一个完全免费、私有且本地运行的搜索聚合器,并使用 LLM 生成答案,无需 GPU。用户可以提出问题,系统…

自动化测试selenium(2)

目录 WebDriver介绍 WebDriver使用 使用WebDriver驱动操作浏览器(打开一个百度) WebDriver 相关API 定位元素 操作元素 上一篇主要介绍了自动化测试的概念以及selenium的基本原理, 这里我们来讲一下如何利用selenium来写测试用的脚本. WebDriver介绍 Selenium是一个用于…

JMM(Java Memory Model java内存模型

目标&#xff1a; 搞清楚高并发场景下&#xff0c;java内存模型是怎么支持的&#xff0c;对象在内存中是怎么布局的&#xff1f; 目录 目标&#xff1a; 搞清楚高并发场景下&#xff0c;java内存模型是怎么支持的&#xff0c;对象在内存中是怎么布局的&#xff1f; 1.硬件层…

若依 ruoyi-vue el-select 多选框 全选 反选 全不选 查询功能

参考文章vueel-select下拉实现&#xff1a;全选、反选、清空功能 如图&#xff0c;优化代码&#xff0c;支持若依字典 import multipleSelect from /components/MultipleSelect/index.vuecomponents: { multipleSelect },<el-row><el-form-item label"分管领域…