首页 > 其他分享 >代码沙盒

代码沙盒

时间:2023-10-25 22:46:52浏览次数:30  
标签:SqlRunnerProvider code return 代码 Object sandbox 沙盒

场景:针对b端的一些系统,针对不同的客户需求,可能都对其进行适配,在标准的产品上做改造开发,但是这种模式不太好,可以在代码层面预留扩展点实现不同租户的自定义。

但是针对租户自定义的代码,不能影响标准功能,所以需要其代码运行在一个沙盒中(设置起运行时间和内存大小)

 

实现方案:

1. java执行动态执行js代码,执行在单独的一个线程中,针对此线程设置起内存和cpu占用监控,一旦达到阈值直接杀死线程 (利用ThreadMXBean可实现)

public static NashornSandbox create(Long maxCpuTimeInMill,Long maxMemoryInBytes) {
        NashornSandbox sandbox = NashornSandboxes.create();
        sandbox.setMaxCPUTime(maxCpuTimeInMill);
        sandbox.setMaxMemory(maxMemoryInBytes);
        sandbox.allowNoBraces(false); 
        sandbox.allowLoadFunctions(true); 
        sandbox.setMaxPreparedStatements(30); 
        sandbox.allowPrintFunctions(false);
        sandbox.allow(SqlRunnerProvider.class);
        ScriptThreadPoolExecutor executor = new ScriptThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
        sandbox.setExecutor(executor);
        return sandbox;
    }
String code = "function execute(){\n"
                + "            var SqlRunnerProvider = Java.type(\"com.example.demo.js.SqlRunnerProvider\");\n"
                + "            return SqlRunnerProvider.selectList(\"select * from request where 1=1\");\n"
                + "        }";
        Object data = ScriptRunner.evalWithBox(code, "execute");
        System.out.println("99999999999999" + JsonUtil.toJson(data));
        
public static Object eval(String code,String method,Object... args) {
        try {
            NashornSandbox box = create();
            box.eval(code);
            return box.getSandboxedInvocable().invokeFunction(method,args);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

 

标签:SqlRunnerProvider,code,return,代码,Object,sandbox,沙盒
From: https://www.cnblogs.com/gstsyyb/p/17788297.html

相关文章

  • 代码随想录第一天 | 704. 二分查找 、 27. 移除元素
    https://leetcode.cn/problems/binary-search/第一眼看到题目的时候下意识直接搞了暴力搜索(一个一个对比),后来觉得时间复杂度太高了,就搞了二分法,之后再看文章,思路透彻了很多,因为我之前写二分法都是凭感觉,没有仔细琢磨过 https://leetcode.cn/problems/remove-element/帅!otto ......
  • 代码随想训练营的第十五天(Python)| 二叉树的前、中、后续遍历(各种花式遍历哈哈)
    前序遍历统一写法用None来区分遍历查找的节点和处理节点1、递归法classSolution:defpreorderTraversal(self,root:Optional[TreeNode])->List[int]:res=[]self.preorder(root,res)returnresdefpreorder(self,root,res):......
  • 如何将Python程序打包并保护源代码
    导言:在某些情况下,我们可能希望将Python程序打包成可执行文件,以便用户无法查看程序的源代码。这种需求通常出现在商业软件、数据分析工具或其他需要保护知识产权的场景中。本文将介绍如何使用PyInstaller工具来打包Python程序,并确保它可以执行和读取配置信息。第一步:安装PyInstal......
  • c语言代码练习37
    问:在一个杨氏矩阵中查找某个数#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intAyue(intarr[3][3],intk,introw,intcol){intx=0;inty=col-1;while(x<row&&y>=0){if(arr[x][y]>k)......
  • Nacos相关技术文档&Golang操作Nacos实现配置监听的代码
    Nacos相关技术文档Nacos中文文档~~~(三)Nacos开发教程之服务数据持久化(四)Nacos开发教程之SpringCloud集成服务注册(参考,后续用go实现)(五)Nacos开发教程之SpringCloud集成配置管理(参考,后续用go实现)(六)Nacos开发教程之后台系统使用~~~Mac-M1电脑本地使用docker搭建Nacos-Server参考:http......
  • 实战系列(一)Dubbo和Spring Cloud的区别,包含代码详解
    Dubbo和SpringCloud都是微服务架构中的重要框架,但它们的定位和关注点不同。Dubbo是阿里巴巴开源的一个高性能、轻量级的RPC框架,主要用于构建微服务之间的服务治理。而SpringCloud是基于SpringBoot的一个微服务架构开发工具,它提供了一系列的开发工具和服务,帮助开发者快......
  • 实战系列(二)MybatisPlus详细介绍,包含代码详解
    MybatisPlus是一个功能强大的MyBatis增强工具,它提供了丰富的特性来简化操作数据库的代码。它主要用于简化JDBC操作,节省开发时间,并能够自动化完成所有的CRUD代码。MybatisPlus官网:https://baomidou.com/1.MybatisPlus的基本功能提供丰富的CRUD方法,包括:insert、selectById......
  • 通过代码连接FTP,下载指定目录的文件
    1#region从SFTP下载文件2varcopy_sftp_result=GetSftpFile();3if(!copy_sftp_result)4{5returnfalse;6}7#endregion89......
  • idea工具git其它分支代码合并到master分支上
    第一步:先提交本地代码到test分支上第二步:切到master分支上,选中要合并的版本,点击Cherry-Pick注意:先切换到master分支上更新代码,再操作第二、三步。 第三步:push一下就好了 ......
  • AI大语言模型+iThinkAir多维表格|打造零代码AI应用
    迄今为止,大语言模型主要以聊天的产品形态面向用户。ChatGPT、文心一言等已经成为人尽皆知的名词,基于ChatGPT、文心一言等的套壳聊天产品也层出不穷让人眼花缭乱。但是,如果要在工作中真正利用大语言模型来进行提效,聊天可能并不是很高效的一种形式。聊天的方式刚开始很吸引人,但是长期......