You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 05:15:02