WSO2 Micro Integrator 4.3中Script Mediator调用JS脚本失败求助
问题描述
使用Docker部署WSO2 Micro Integrator 4.3,配置RabbitMQ入站端点从队列获取消息触发序列,尝试通过Script Mediator执行JavaScript脚本时失败,报错java.lang.NoSuchMethodException: testFunction。
序列配置
<?xml version="1.0" encoding="UTF-8"?> <sequence name="TestScriptSequence" trace="disable" xmlns="http://ws.apache.org/ns/synapse"> <!-- Log initial --> <log level="custom"> <property name="Status" value="Message received"/> <property expression="json-eval($)" name="Payload"/> </log> <!-- Appel du Script Mediator --> <localEntry key="DisplayNameScript" src="file:scripts/JS/test..js"/> <script function="testFunction" key="DisplayNameScript" language="js"/> <!-- Log après le traitement --> <log level="custom"> <property name="Status" value="Message processed by script"/> <property expression="json-eval($)" name="Payload"/> </log> </sequence>
JavaScript脚本内容
function testFunction(mc) { // Récupération du logger var log = mc.getServiceLog(); log.info("Script test.js exécuté."); // Récupération du message JSON var payload = mc.getPayloadJSON(); log.info("Payload initial : " + JSON.stringify(payload)); // Modification du message payload.processed = true; payload.message = "Traitement réussi par test.js"; mc.setPayloadJSON(payload);}
错误日志片段
[2025-01-01 16:58:59,118] ERROR {ScriptMediator} - {inboundendpoint:RabbitMQInboundEndpoint} The script engine returned a NoSuchMethodException executing the external js script : Value {name ='null', keyValue ='DisplayNameScript'} function testFunction java.lang.NoSuchMethodException: testFunction at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.noSuchMethod(GraalJSScriptEngine.java:583) at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.invokeFunction(GraalJSScriptEngine.java:571) ...
解决方案
1. 修正脚本文件名错误
序列配置中localEntry的src属性写的是test..js(两个点),属于无效文件名,改为正确的test.js:
<localEntry key="DisplayNameScript" src="file:scripts/JS/test.js"/>
2. 确保Docker环境下脚本路径正确
- 本地创建目录
./scripts/JS,将test.js放入该目录 - 在Docker启动命令或
docker-compose.yml中添加目录挂载,让容器能访问脚本文件:
容器内的路径docker run -v $(pwd)/scripts:/home/wso2carbon/scripts wso2/wso2mi:4.3.0/home/wso2carbon/scripts/JS/test.js会对应本地的./scripts/JS/test.js,序列中的file:scripts/JS/test.js会基于容器用户主目录(/home/wso2carbon)解析。
3. 适配GraalJS引擎的函数暴露方式
WSO2 MI 4.3使用GraalJS作为JavaScript引擎,需确保函数暴露到全局作用域,修改脚本内容:
function testFunction(mc) { // Récupération du logger var log = mc.getServiceLog(); log.info("Script test.js exécuté."); // Récupération du message JSON var payload = mc.getPayloadJSON(); log.info("Payload initial : " + JSON.stringify(payload)); // Modification du message payload.processed = true; payload.message = "Traitement réussi par test.js"; mc.setPayloadJSON(payload); } // 将函数暴露到全局作用域,供Script Mediator调用 this.testFunction = testFunction;
4. 验证脚本加载状态
启动容器后,查看DEBUG日志是否有脚本加载成功的提示:
- 若日志显示
Scripting language : js source loaded with key : Value {name ='null', keyValue ='DisplayNameScript'},说明脚本已加载成功 - 若仍报错文件未找到,检查挂载目录的权限,确保容器用户
wso2carbon能读取脚本文件
内容的提问来源于stack exchange,提问作者JMH
相关产品推荐
相关产品推荐

