【踩坑记录】记一次使用ScriptEngineManager导致资源未能正常关闭,资源泄漏问题

引入和背景介绍:

低代码平台中的公共导出接口要实现自定义格式化数据,最后讨论后决定使用用户在前端页面编写JS代码,然后后端去执行JS获取格式化后的数据

这里功能实现比较简单,但是当我导出几千条数据再去格式化时出问题了!!!

问题描述:

因为我用的是POI做的导出,当时报错信息为This archive contains unclosed entries,最开始一直以为是POI的问题,一步步排查后发现加上格式化就不行了,然后就去看这个ScriptEngineManager类,初步猜测可能执行JS会导致资源泄漏,最后看到一篇文章有提到这个ScriptEngineManager groovy 内存泄露_scriptenginemanager的缺点-CSDN博客

然后我也做了下更改后,再去导出数据然后格式化就可以了!!!

解决方案:

这里我贴一下原代码和更改后的代码

原代码:

 ScriptEngineManager manager = new ScriptEngineManager();
 ScriptEngine engine = manager.getEngineByName("nashorn");
 String rule = "function convert() {" + formatConfig + " }convert();";
 String val = String.valueOf(engine.eval(rule));

更改后:

首先将ScriptEngine改为全局变量,我们用的SpingBoot项目,使用@PostConstruct注解时类上要加@Component

 private static final ScriptEngineManager factory = new ScriptEngineManager();
 private static ScriptEngine engine = null;

 @PostConstruct
 public void init() {
    engine = factory.getEngineByName("nashorn");
 }

    

然后方法中调用即可

 String rule = "function convert() {" + formatConfig + " }convert();";
 String val = String.valueOf(engine.eval(rule));

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值