引入和背景介绍:
低代码平台中的公共导出接口要实现自定义格式化数据,最后讨论后决定使用用户在前端页面编写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));