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));
    }
}

 

posted @ 2024-02-26 10:28  官萧何  阅读(383)  评论(0)    收藏  举报