diff --git a/servo/src/main/java/com/yvan/workbench/StartWorkbench.java b/servo/src/main/java/com/yvan/workbench/StartWorkbench.java index 5766127..3788fff 100644 --- a/servo/src/main/java/com/yvan/workbench/StartWorkbench.java +++ b/servo/src/main/java/com/yvan/workbench/StartWorkbench.java @@ -19,6 +19,7 @@ import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; ) public class StartWorkbench { public static void main(String[] args) { + System.setProperty("polyglot.engine.WarnInterpreterOnly", "false"); SpringApplication application = new SpringApplication(StartWorkbench.class); application.run(args); } diff --git a/servo/src/main/java/com/yvan/workbench/controller/JsDemo.java b/servo/src/main/java/com/yvan/workbench/controller/JsDemo.java index 7cbc7c7..e6285e7 100644 --- a/servo/src/main/java/com/yvan/workbench/controller/JsDemo.java +++ b/servo/src/main/java/com/yvan/workbench/controller/JsDemo.java @@ -1,4 +1,53 @@ package com.yvan.workbench.controller; +import org.apache.commons.pool2.impl.GenericObjectPoolConfig; +import org.clever.core.AppShutdownHook; +import org.clever.core.Conv; +import org.clever.js.api.ScriptEngineInstance; +import org.clever.js.api.ScriptObject; +import org.clever.js.api.folder.FileSystemFolder; +import org.clever.js.api.folder.Folder; +import org.clever.js.api.pool.GenericEngineInstancePool; +import org.clever.js.graaljs.pool.GraalSingleEngineFactory; +import org.clever.js.graaljs.utils.InteropScriptToJavaUtils; +import org.clever.web.mvc.annotation.RequestBody; +import org.graalvm.polyglot.Context; +import org.graalvm.polyglot.Value; + +import java.io.File; +import java.time.Duration; +import java.util.Map; + public class JsDemo { + private static final GenericEngineInstancePool pool; + + static { + String basePath = new File("./yvan-lcc-bench/servo/src/test/resources/javascript").getAbsolutePath(); + Folder rootFolder = FileSystemFolder.createRootPath(basePath); + // 创建对象池配置 + GenericObjectPoolConfig> config = new GenericObjectPoolConfig<>(); + config.setMaxWait(Duration.ofMillis(-1)); + config.setMaxTotal(8); + config.setMinIdle(2); + // 创建对象工厂 + GraalSingleEngineFactory factory = GraalSingleEngineFactory.create(rootFolder); + // 创建对象池 + pool = new GenericEngineInstancePool<>(factory, config); + AppShutdownHook.addShutdownHook(() -> { + factory.close(); + pool.close(); + }); + } + + public static Object runJs(@RequestBody Map params) throws Exception { + String jsCode = Conv.asString(params.get("jsCode")); + ScriptEngineInstance engineInstance = pool.borrowObject(); + try { + ScriptObject fun = engineInstance.wrapFunction(jsCode); + Object res = fun.execute(); + return InteropScriptToJavaUtils.INSTANCE.toJavaObject(res); + } finally { + pool.returnObject(engineInstance); + } + } }