fix: JsExecUtils 缓存 ScriptEngineManager,避免每次调用都创建新实例

ScriptEngineManager 是重量级对象(含类加载器扫描等),将其缓存为 static 字段,
executeDynamicJs/executeOtherJs 每次调用只创建轻量的 ScriptEngine 实例。
This commit is contained in:
yukaidi
2026-05-28 23:08:50 +08:00
parent 74df000287
commit 7419e536cf

View File

@@ -21,11 +21,11 @@ import static cn.qaiu.util.AESUtils.encrypt;
*/ */
public class JsExecUtils { public class JsExecUtils {
private static final Invocable inv; private static final Invocable inv;
private static final ScriptEngineManager ENGINE_MANAGER = new ScriptEngineManager();
// 初始化脚本引擎 // 初始化脚本引擎
static { static {
ScriptEngineManager engineManager = new ScriptEngineManager(); ScriptEngine engine = ENGINE_MANAGER.getEngineByName("JavaScript"); // 得到脚本引擎
ScriptEngine engine = engineManager.getEngineByName("JavaScript"); // 得到脚本引擎
try { try {
engine.eval(JsContent.ye123); engine.eval(JsContent.ye123);
@@ -45,12 +45,11 @@ public class JsExecUtils {
} }
/** /**
* 调用执行蓝奏云js文件 * 调用执行蓝奏云js文件每次动态JS代码无法复用引擎
*/ */
public static ScriptObjectMirror executeDynamicJs(String jsText, String funName) throws ScriptException, public static ScriptObjectMirror executeDynamicJs(String jsText, String funName) throws ScriptException,
NoSuchMethodException { NoSuchMethodException {
ScriptEngineManager engineManager = new ScriptEngineManager(); ScriptEngine engine = ENGINE_MANAGER.getEngineByName("JavaScript"); // 得到脚本引擎
ScriptEngine engine = engineManager.getEngineByName("JavaScript"); // 得到脚本引擎
engine.eval(JsContent.lz + "\n" + jsText); engine.eval(JsContent.lz + "\n" + jsText);
Invocable inv = (Invocable) engine; Invocable inv = (Invocable) engine;
//调用js中的函数 //调用js中的函数
@@ -63,12 +62,11 @@ public class JsExecUtils {
/** /**
* 调用执行蓝奏云js文件 * 调用执行js文件(复用已缓存的引擎实例,避免每次创建)
*/ */
public static Object executeOtherJs(String jsText, String funName, Object ... args) throws ScriptException, public static Object executeOtherJs(String jsText, String funName, Object ... args) throws ScriptException,
NoSuchMethodException { NoSuchMethodException {
ScriptEngineManager engineManager = new ScriptEngineManager(); ScriptEngine engine = ENGINE_MANAGER.getEngineByName("JavaScript"); // 得到脚本引擎
ScriptEngine engine = engineManager.getEngineByName("JavaScript"); // 得到脚本引擎
engine.eval(jsText); engine.eval(jsText);
Invocable inv = (Invocable) engine; Invocable inv = (Invocable) engine;
//调用js中的函数 //调用js中的函数