首页 > 其他分享 >springBoot 整合 groovy 实现表达式解析 该示例可以用于配置告警规则

springBoot 整合 groovy 实现表达式解析 该示例可以用于配置告警规则

时间:2024-02-26 10:33:05浏览次数:28  
标签:groovy engine String 示例 scriptContent put bindings springBoot

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 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 testByFunction1(){
        // 初始化Bindings
        Bindings bindings = engine.createBindings();
        // 绑定参数
        bindings.put("a1", 1);
        bindings.put("a2", 1);
        bindings.put("b1", 1);
        bindings.put("b2", 1);
        // 定义groovy脚本中执行方法的名称
        final String scriptName = "cal";
        // 定义groovy脚本内容
        String expression = "(a1>2||a2>2)&&(b1>2||b2>10)";
        String scriptContent = "def "+scriptName+"(){return "+expression+"}";
        try {
            // 执行脚本
            engine.eval(scriptContent, bindings);
            // 获取执行结果
            Invocable invocable = (Invocable) engine;
            Boolean flag = (Boolean) invocable.invokeFunction(scriptName);
            System.out.println("---------------------------------------");
            System.out.println("result is: " + flag);
        } catch (ScriptException | NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
//        testByFunction();
        // 定义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));
    }
}

 

标签:groovy,engine,String,示例,scriptContent,put,bindings,springBoot
From: https://www.cnblogs.com/guanxiaohe/p/18033787

相关文章

  • 【Mybatis-Plus】Mybatis-Plus 是如何整合到 SpringBoot 中的呢?
    1 前言上次我们看了Mybatis是如何整合到SpringBoot的,那么平时我们可能直接用的就是Mybatis-Plus,那么它又是如何结合到的SpringBoot的呢?原理其实是一样的,这节我们就来看看。看的过程中,其实会深深体会Mybatis-Plus就是对Mybatis的增强,类似SpringBoot对Spring的增......
  • SpringBoot:通过实现自定义接口获取实现类的@RequestMapping注解请求路径
    1.自定义接口//什么都不用写,就定义一个空接口publicinterfaceMyMark{}2.Controller接口类实现自定义接口@RestControllerpublicclassDayControllerimplementsMyMark{@RequestMapping("/day1")publicStringget1(){return"day1";}......
  • SpringBoot结合Liquibase实现数据库变更管理
    https://juejin.cn/post/7171232605478584328 https://juejin.cn/post/7170857098538909732  前言研发过程中经常涉及到数据库变更,对表结构的修复及对数据的修改,为了保证各环境都能正确的进行变更,我们可能需要维护一个数据库升级文档来保存这些记录,有需要升级的环境按......
  • opencv android studio build.gradle修改为build.gradle.kts 文件示例
    注意将openCVersionName,openCVersionCode,compileSdk,minSdk进行相应的修改即可.plugins{id("com.android.library")id("org.jetbrains.kotlin.android")}valopenCVersionName="4.9.0"valopenCVersionCode=((4*100+9)*1......
  • Linux离线部署SpringBoot前后端分离项目
    本文介绍了在内网下的纯离线环境中部署SpringBoot前后端分离项目,由于是个前端仔,并未接触过linux,在经历诸多错误和踩坑之后,终于部署成功(大哭),在此记录一下。工具选择选择合适的工具进行远程连接,如Xshell、Xftp、putty、Terminus等Xshell:连接远程服务器的命令终端Xftp:连接远......
  • JWT(Token令牌)整合 SpringBoot
     前言:JWT(JSONWebToken)可以被称为令牌(token)。JWT是一种在网络应用中广泛使用的令牌格式,用于在用户和服务器之间传递安全可靠的信息。JWT通常包含了用户的身份信息和一些其他的元数据,被用作身份验证和授权。因此,人们经常将JWT简称为令牌(token)。 代码整合:1.导......
  • Kafka 集成SpringBoot
    1.环境准备1.Kafka集群环境准备1.准备一个Kafka集群环境并启动Kafka3.6.1集群安装与部署2.创建firstTopic/usr/kafka/kafka_2.13-3.6.1/bin/kafka-topics.sh--bootstrap-server192.168.58.130:9092--create--partitions1--replication-factor3--topicfirst2.Sp......
  • 【KingbaseES】sys_restore命令详解及示例
    原文地址:https://blog.csdn.net/sinat_36528886/article/details/134491475【KingbaseES】sys_restore命令详解及示例一、概述二、语法一、概述sys_restore—从一个由sys_dump创建的归档文件恢复一个KingbaseES数据库sys_restore是一个用来从sys_dump创建的非文本格式......
  • SpringBoot + Redis 的配置及使用
    一、SpringBoot配置Redis1.1pom引入spring-boot-starter-data-redis包<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></......
  • 玩转SpringBoot:动态排除Starter配置,轻松部署
    引言在软件开发中,进行本地单元测试是一项常规且必要的任务。然而,在进行单元测试时,有时需要启动一些中间件服务,如Kafka、Elasticjob等。举例来说,我曾经遇到过一个问题:项目中使用了Redisson锁,但由于Redisson版本较低,在Mac环境下偶尔会报错#RedisConnectionException:Unabletoin......