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

WSO2中JSON内容追加至JSON文件报错的解决方案咨询

解决VFS追加JSON数组时的"The file type does not support append mode"问题

直接使用VFS的append=true配置无法满足JSON数组的结构化追加需求(单纯文本追加会破坏JSON格式,且部分VFS传输如SFTP对append模式支持有限),以下是几种可行的解决方法:

方法1:读取现有文件合并后重写

核心思路是先获取目标文件的现有JSON数组,将新的JSON对象加入数组,再完整写入文件,绕过VFS的append限制。

实现步骤与配置示例

<!-- 1. 读取目标文件的现有内容(文件不存在则返回空) -->
<call>
    <endpoint>
        <address uri="vfs:sftp://username:password/home/user/test/out/json/Test${ctx:File_Name}.txt"/>
    </endpoint>
</call>

<!-- 2. 合并新Payload到现有数组 -->
<script language="js">
    // 获取现有文件的JSON内容
    var existingArray = mc.getPayloadJSON() || [];
    // 获取新的JSON对象(假设已存入NEW_PAYLOAD属性)
    var newItem = JSON.parse(mc.getProperty('NEW_PAYLOAD'));
    // 追加新对象到数组
    existingArray.push(newItem);
    // 设置合并后的数组为新Payload
    mc.setPayloadJSON(existingArray);
</script>

<!-- 3. 将合并后的内容写入目标文件(覆盖模式) -->
<propertyGroup description="File and OutputPayload properties">
    <property name="messageType" scope="axis2" type="STRING" value="application/json"/>
    <property name="ContentType" scope="axis2" type="STRING" value="application/json"/>
    <property expression="$ctx:FILE_NAME" name="transport.vfs.ReplyFileName" scope="transport" type="STRING"/>
    <property name="OUT_ONLY" scope="default" type="STRING" value="true"/>
</propertyGroup>

<call>
    <endpoint>
        <address uri="vfs:sftp://username:password/home/user/test/out/json"/>
    </endpoint>
</call>

方法2:临时文件批量合并

如果数据量较大,频繁读写整个文件影响性能,可先将每个JSON对象写入独立临时文件,再通过定时任务合并成最终数组。

实现步骤

  1. 每个新Payload写入唯一命名的临时文件(如temp_${uuid}.txt)
  2. 配置WSO2定时任务,定时扫描临时文件目录:
    • 读取所有临时文件的JSON内容,组装成数组
    • 将数组写入目标文件
    • 删除所有临时文件

定时任务核心脚本示例(JavaScript)

var tempDir = "vfs:sftp://username:password/home/user/test/temp/";
var targetFile = "vfs:sftp://username:password/home/user/test/out/json/Test${ctx:File_Name}.txt";
var finalArray = [];

// 读取所有临时文件
var tempFiles = mc.getTransport().vfs.list(tempDir);
for each (var file in tempFiles) {
    var content = mc.getTransport().vfs.read(tempDir + file);
    finalArray.push(JSON.parse(content));
    // 删除临时文件
    mc.getTransport().vfs.deleteFile(tempDir + file);
}

// 将合并后的数组写入目标文件
mc.setPayloadJSON(finalArray);
// 后续写入VFS的配置同方法1...

方法3:使用Message Store + Processor批量处理

利用WSO2的消息存储组件暂存所有JSON对象,再通过消息处理器定时批量取出并组装成数组写入文件。

实现步骤

  1. 配置Message Store(如内存存储或JDBC存储),存储每个传入的JSON Payload
  2. 配置Message Processor,定时从Store中取出所有消息:
    • 收集所有消息体的JSON对象,组装成数组
    • 将数组写入目标文件
    • 清空已处理的消息

核心序列配置示例

<sequence name="BatchProcessSequence">
    <property name="COLLECTED_ITEMS" scope="default" type="STRING" value="[]"/>
    <!-- 遍历所有消息 -->
    <iterate expression="//message" id="batchIter">
        <target>
            <sequence>
                <script language="js">
                    var collected = JSON.parse(mc.getProperty('COLLECTED_ITEMS'));
                    var currentItem = mc.getPayloadJSON();
                    collected.push(currentItem);
                    mc.setProperty('COLLECTED_ITEMS', JSON.stringify(collected));
                </script>
            </sequence>
        </target>
    </iterate>
    <!-- 聚合结果并写入文件 -->
    <aggregate id="batchIter">
        <completeCondition>
            <messageCount max="-1" min="-1"/>
        </completeCondition>
        <onComplete>
            <script language="js">
                var finalArray = JSON.parse(mc.getProperty('COLLECTED_ITEMS'));
                mc.setPayloadJSON(finalArray);
            </script>
            <!-- 写入目标文件的配置同方法1 -->
        </onComplete>
    </aggregate>
</sequence>

内容的提问来源于stack exchange,提问作者Ruby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:21:06