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对象写入独立临时文件,再通过定时任务合并成最终数组。
实现步骤
- 每个新Payload写入唯一命名的临时文件(如
temp_${uuid}.txt) - 配置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对象,再通过消息处理器定时批量取出并组装成数组写入文件。
实现步骤
- 配置Message Store(如内存存储或JDBC存储),存储每个传入的JSON Payload
- 配置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
相关产品推荐
相关产品推荐

