springBoot 整合 groovy 实现表达式解析 该示例可以用于配置告警规则
1.引入pom
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>3.0.9</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-jsr223</artifactId>
<version>3.0.9</version>
</dependency>
2.引入util类 具体使用场景根据需求
package com.mybatis.plus.utils; import groovy.lang.GroovyClassLoader; import groovy.lang.GroovyObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.script.*; import java.util.HashMap; import java.util.Map; /** * @Description: 执行groovy脚本 * @Author: gch * @Date: 2024/2/26 10:22 */ public class GroovyScriptUtils { private static Logger logger = LoggerFactory.getLogger(GroovyScriptUtils.class); // 查找并创建指定脚本引擎 private static ScriptEngine engine = new ScriptEngineManager().getEngineByName("groovy"); public static Boolean executeWithParams(String scriptContent,String methodName, Map<String, Object> params) { // 初始化Bindings 传参 Bindings bindings = engine.createBindings(); params.forEach((k, v) -> { bindings.put(k, v); }); // 执行脚本 try { engine.eval(scriptContent, bindings); // 获取执行结果 Invocable invocable = (Invocable) engine; Boolean flag = (Boolean) invocable.invokeFunction(methodName); logger.info("执行结果:{}", flag); return flag; } catch (Exception e) { throw new RuntimeException("执行Groovy脚本出错,请检查表达式是否正确", e); } } public static void main(String[] args) { // test1(); test2(); } private static void test1() { final String scriptName = "cal"; String expression = "!((3>2)&&(3-1<0))||(3==3)&&(3!=5)"; String scriptContent = "def cal(){return "+expression+"}"; logger.info("执行结果:{}", executeWithParams(scriptContent, scriptName, new HashMap<>())); } private static void test2() { // 定义groovy脚本中执行方法的名称 final String scriptName = "cal"; // 定义groovy脚本内容 String expression = "(a1>2||a2>2)&&(b1>2||b2>10)"; String scriptContent = "def "+scriptName+"(){return "+expression+"}"; // 绑定参数 HashMap<String, Object> map = new HashMap<>(); map.put("a1", 1); map.put("a2", 1); map.put("b1", 1); map.put("b2", 1); logger.info("执行结果:{}", executeWithParams(scriptContent, scriptName, map)); } }
⎛⎝官萧何⎠⎞一只快乐的爪哇程序猿;邮箱:1570608034@qq.com

浙公网安备 33010602011771号