engines = new ConcurrentHashMap<>();
+
+ /**
+ * 获取脚本引擎
+ *
+ * @param type 脚本类型
+ * @return 脚本引擎
+ */
+ public ScriptEngine getEngine(String type) {
+ // 从缓存中获取引擎
+ return engines.computeIfAbsent(type, this::createEngine);
+ }
+
+ /**
+ * 创建脚本引擎
+ *
+ * @param type 脚本类型
+ * @return 脚本引擎
+ */
+ private ScriptEngine createEngine(String type) {
+ try {
+ if (JsScriptEngine.TYPE.equals(type)) {
+ log.info("创建 GraalJS 脚本引擎");
+ return new JsScriptEngine(new JsSandbox());
+ }
+
+ log.warn("不支持的脚本类型: {}", type);
+ return null;
+ } catch (Exception e) {
+ log.error("创建脚本引擎 [{}] 失败: {}", type, e.getMessage(), e);
+ throw new RuntimeException("创建脚本引擎失败: " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * 释放指定类型的引擎资源
+ *
+ * @param type 脚本类型
+ */
+ public void releaseEngine(String type) {
+ ScriptEngine engine = engines.remove(type);
+ if (engine instanceof AutoCloseable) {
+ try {
+ ((AutoCloseable) engine).close();
+ log.info("已释放脚本引擎资源: {}", type);
+ } catch (Exception e) {
+ log.warn("释放脚本引擎 [{}] 资源时发生错误: {}", type, e.getMessage());
+ }
+ }
+ }
+
+ /**
+ * 清理所有引擎资源
+ */
+ public void releaseAllEngines() {
+ engines.keySet().forEach(this::releaseEngine);
+ log.info("已清理所有脚本引擎资源");
+ }
+
+ @Override
+ public void destroy() {
+ log.info("应用关闭,释放所有脚本引擎资源...");
+ releaseAllEngines();
+ }
+}
\ No newline at end of file
diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/script/example/GraalJsExample.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/script/example/GraalJsExample.java
new file mode 100644
index 0000000..636f96b
--- /dev/null
+++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/script/example/GraalJsExample.java
@@ -0,0 +1,209 @@
+package cn.iocoder.yudao.module.iot.script.example;
+
+import cn.hutool.core.map.MapUtil;
+import cn.iocoder.yudao.module.iot.script.context.DefaultScriptContext;
+import cn.iocoder.yudao.module.iot.script.context.ScriptContext;
+import cn.iocoder.yudao.module.iot.script.service.ScriptService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+// TODO @haohao:搞到 test 里面哈;
+/**
+ * GraalJS 脚本引擎示例
+ *
+ * 展示了如何使用 GraalJS 脚本引擎的各种功能
+ */
+@Slf4j
+@Component
+public class GraalJsExample {
+
+ @Autowired
+ private ScriptService scriptService;
+
+ /**
+ * 执行简单的 JavaScript 脚本
+ *
+ * @return 执行结果
+ */
+ public Object executeSimpleScript() {
+ // 简单的脚本内容
+ String script = "var result = a + b; result;";
+
+ // 创建参数
+ Map params = MapUtil.newHashMap();
+ params.put("a", 10);
+ params.put("b", 20);
+
+ // 执行脚本
+ return scriptService.executeJavaScript(script, params);
+ }
+
+ /**
+ * 执行现代 JavaScript 语法(ES6+)
+ *
+ * @return 执行结果
+ */
+ public Object executeModernJavaScript() {
+ // 使用现代 JavaScript 语法
+ String script = "// 使用箭头函数\n" +
+ "const add = (a, b) => a + b;\n" +
+ "\n" +
+ "// 使用解构赋值\n" +
+ "const {c, d} = params;\n" +
+ "\n" +
+ "// 使用模板字符串\n" +
+ "const result = `计算结果: ${add(c, d)}`;\n" +
+ "\n" +
+ "// 使用可选链操作符\n" +
+ "const value = params?.e?.value ?? 'default';\n" +
+ "\n" +
+ "// 返回一个对象\n" +
+ "({\n" +
+ " sum: add(c, d),\n" +
+ " message: result,\n" +
+ " defaultValue: value\n" +
+ "})";
+
+ // 创建参数
+ Map params = MapUtil.newHashMap();
+ params.put("params", MapUtil.builder()
+ .put("c", 30)
+ .put("d", 40)
+ .build());
+
+ // 执行脚本
+ return scriptService.executeJavaScript(script, params);
+ }
+
+ /**
+ * 执行带错误处理的脚本
+ *
+ * @return 执行结果
+ */
+ public Object executeWithErrorHandling() {
+ // 包含错误处理的脚本
+ String script = "try {\n" +
+ " // 故意制造错误\n" +
+ " if (!nonExistentVar) {\n" +
+ " throw new Error('手动抛出的错误');\n" +
+ " }\n" +
+ "} catch (error) {\n" +
+ " console.error('捕获到错误: ' + error.message);\n" +
+ " return { success: false, error: error.message };\n" +
+ "}\n" +
+ "\n" +
+ "return { success: true, data: 'No error' };";
+
+ // 执行脚本
+ return scriptService.executeJavaScript(script, MapUtil.newHashMap());
+ }
+
+ /**
+ * 演示超时控制
+ *
+ * @return 执行结果
+ */
+ public Object executeWithTimeout() {
+ // 这个脚本会导致无限循环
+ String script = "// 无限循环\n" +
+ "var counter = 0;\n" +
+ "while(true) {\n" +
+ " counter++;\n" +
+ " if (counter % 1000000 === 0) {\n" +
+ " console.log('Still running: ' + counter);\n" +
+ " }\n" +
+ "}\n" +
+ "return counter;";
+
+ // 使用 CompletableFuture 和超时控制
+ CompletableFuture