Spring 使用 Groovy 实现动态server

本人在项目中遇到这么个需求,有一个模块的server方法需要频繁修改
经阅读可以使用 Groovy 使用java脚本来时

pom坐标

<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy</artifactId>
    <version>3.0.9</version>
</dependency>

实例代码

public interface IGroovyHandler {

    List<JSONObject> transform(List<JSONObject> data);
}

动态加载

@Component
@Slf4j
public class GroovyTransformServiceImpl implements TransformStrategy {

    private GroovyClassLoader groovyClassLoader = new GroovyClassLoader();

    /**
     * 数据清洗转换 类型
     *
     * @return
     */
    @Override
    public String type() {
        return "javaBean";
    }

    /***
     * 清洗转换算法接口
     * @param def
     * @param data
     * @return
     */
    @Override
    public List<JSONObject> transform(DataSetTransformDto def, List<JSONObject> data) {
        String transformScript = def.getTransformScript();
        Class<?> clazz = groovyClassLoader.parseClass(transformScript);
        if (clazz != null) {
            try {
                Object instance = clazz.newInstance();
                if (instance!=null) {
                    if (instance instanceof IGroovyHandler) {
                        IGroovyHandler handler = (IGroovyHandler) instance;
                        return handler.transform(data);
                    } else {
                        System.err.println("转换失败!");
                    }
                }
            } catch (Exception e) {
                log.info("执行javaBean异常", e);
                throw new RuntimeException(e.getMessage());
            }
        }
        return data;
    }
}

java 脚本 在idea中写好之后 转化成字符串 运行

package com;

import com.alibaba.fastjson.JSONObject;
import com.anjiplus.template.gaea.business.modules.datasettransform.service.IGroovyHandler;

import java.util.ArrayList;
import java.util.List;

/**
 * 建议在idea写好复制整个类到此处,位置report-core/src/test/java/com/DemoGroovyHandler.java
 */
public class DemoGroovyHandler implements IGroovyHandler {

    @Override
    public List<JSONObject> transform(List<JSONObject> data) {

        for (JSONObject datum : data) {
            List<Double> value = new ArrayList<>();
            Double longitude = datum.getDouble("longitude");
            Double latitude = datum.getDouble("latitude");
            value.add(longitude);
            value.add(latitude);
            datum.put("value", value);
            datum.put("name", "");
			datum.remove("longitude")
			datum.remove("latitude")
        }
        return data;
    }
}

demo代码

import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;

import java.lang.reflect.InvocationTargetException;

public class GroovyTest {
    public static void main(String[] args) throws Exception {
        //test01();
        test02();
    }
    private static void test02() throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        GroovyClassLoader loader = new GroovyClassLoader();
        // java代码
        String java = "import java.sql.*;\n" +
                "import java.util.ArrayList;\n" +
                "import java.util.HashMap;\n" +
                "import java.util.List;\n" +
                "import java.util.Map;\n" +
                "\n" +
                "public class JDBCTest {\n" +
                "    \n" +
                "    private static List<Map> getData() {\n" +
                "        // 数据库URL,用户名和密码\n" +
                "        String url = \"jdbc:mysql://172.16.90.xxx:3306/xx\";\n" +
                "        String user = \"root\";\n" +
                "        String password = \"123456\";\n" +
                "\n" +
                "        Connection conn = null;\n" +
                "        Statement stmt = null;\n" +
                "        ResultSet rs = null;\n" +
                "        List<Map> data = new ArrayList<>();\n" +
                "        try {\n" +
                "            // 加载数据库驱动\n" +
                "            Class.forName(\"com.mysql.cj.jdbc.Driver\");\n" +
                "\n" +
                "            // 建立连接\n" +
                "            conn = DriverManager.getConnection(url, user, password);\n" +
                "\n" +
                "            // 创建Statement对象\n" +
                "            stmt = conn.createStatement();\n" +
                "\n" +
                "            // 执行查询\n" +
                "            rs = stmt.executeQuery(\"SELECT kdmc FROM frm_wlxx\");\n" +
                "\n" +
                "            // 获取结果集的元数据\n" +
                "            ResultSetMetaData rsmd = rs.getMetaData();\n" +
                "\n" +
                "            // 获取列数\n" +
                "            int columnsCount = rsmd.getColumnCount();\n" +
                "\n" +
                "            // 遍历每一行数据\n" +
                "            while (rs.next()) {\n" +
                "                Map obj = new HashMap();\n" +
                "                for (int i = 1; i <= columnsCount; i++) {\n" +
                "                    // 获取列名\n" +
                "                    String columnName = rsmd.getColumnName(i);\n" +
                "                    // 获取对应列的值\n" +
                "                    Object columnValue = rs.getObject(i);\n" +
                "\n" +
                "                    obj.put(columnName, columnValue);\n" +
                "\n" +
                "                }\n" +
                "                data.add(obj);\n" +
                "            }\n" +
                "            // 处理结果\n" +
                "//            while (rs.next()) {\n" +
                "//                String string = rs.getString(\"kdmc\");\n" +
                "\n" +
                "\n" +
                "//                String query =\"SELECT kdmc FROM frm_wlxx where kdmc=?\";\n" +
                "//\n" +
                "//                PreparedStatement pstmt = conn.prepareStatement(query);\n" +
                "//\n" +
                "//                pstmt.setString(1, string);\n" +
                "//\n" +
                "//                ResultSet child = pstmt.executeQuery();\n" +
                "//                while (child.next()) {\n" +
                "//                    String childObj = child.getString(\"kdmc\");\n" +
                "//                    System.out.println(childObj);\n" +
                "//                }\n" +
                "//            }\n" +
                "        } catch (Exception e) {\n" +
                "            e.printStackTrace();\n" +
                "        } finally {\n" +
                "            // 关闭资源\n" +
                "            try {\n" +
                "                if (rs != null) {\n" +
                "                    rs.close();\n" +
                "                    rs = null;\n" +
                "                }\n" +
                "                if (stmt != null) {\n" +
                "                    stmt.close();\n" +
                "                    stmt = null;\n" +
                "                }\n" +
                "                if (conn != null) {\n" +
                "                    conn.close();\n" +
                "                    conn = null;\n" +
                "                }\n" +
                "            } catch (Exception e) {\n" +
                "                e.printStackTrace();\n" +
                "            }\n" +
                "        }\n" +
                "        return data;\n" +
                "    }\n" +
                "}\n";
        Class scriptClass = loader.parseClass(java);
        GroovyObject scriptInstance = (GroovyObject) scriptClass.getDeclaredConstructor().newInstance();
        Object result = scriptInstance.invokeMethod("getData", new Object[]{});
        System.out.println("Groovy result=" + result);
    }
    private static void test01() throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        GroovyClassLoader loader = new GroovyClassLoader();
        // java代码
        String java = " " +
                "   public class Test { " +
                "      public int add(double a, double b) { " +
                "        double sum = a + b;  " +
                "         System.out.println(\"Script sum=\" + sum);  " +
                "         return sum.intValue(); " +
                "      }  " +
                "  } ";
        Class scriptClass = loader.parseClass(java);
        GroovyObject scriptInstance = (GroovyObject) scriptClass.getDeclaredConstructor().newInstance();
        Object result = scriptInstance.invokeMethod("add", new Object[]{1, 2});
        System.out.println("Groovy result=" + result);
    }


}

以下是使用Spring Websocket Grails插件的步骤: 1. 在`build.gradle`文件中添加以下依赖项: ```groovy compile "org.grails.plugins:spring-websocket:2.4.0" ``` 2. 在`grails-app/conf/spring/resources.groovy`文件中添加以下bean: ```groovy import org.springframework.web.socket.server.standard.ServerEndpointExporter beans = { serverEndpointExporter(ServerEndpointExporter) } ``` 3. 创建一个WebSocket处理程序类,该类应实现`org.springframework.web.socket.WebSocketHandler`接口,并覆盖其方法。 ```groovy import org.springframework.web.socket.WebSocketSession import org.springframework.web.socket.handler.TextWebSocketHandler class MyWebSocketHandler extends TextWebSocketHandler { @Override void handleTextMessage(WebSocketSession session, TextMessage message) { // 处理文本消息 } } ``` 4. 创建一个WebSocket配置类,该类应实现`org.springframework.web.socket.config.annotation.WebSocketConfigurer`接口,并覆盖其方法。 ```groovy import org.springframework.context.annotation.Configuration import org.springframework.web.socket.config.annotation.EnableWebSocket import org.springframework.web.socket.config.annotation.WebSocketConfigurer import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry @Configuration @EnableWebSocket class MyWebSocketConfig implements WebSocketConfigurer { @Override void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new MyWebSocketHandler(), "/my-websocket") } } ``` 5. 在启动类上添加`@EnableWebSocket`注解。 ```groovy import org.springframework.boot.SpringApplication import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.web.socket.config.annotation.EnableWebSocket @SpringBootApplication @EnableWebSocket class MyApplication { static void main(String[] args) { SpringApplication.run(MyApplication, args) } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值