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

WSO2 ESB VFS代理无法正确移动文件至Out目录求助

解决VFS代理生成response.xml而非移动文件的问题

我来帮你分析这个问题,看起来你的VFS代理配置里存在逻辑冲突,导致文件没有按预期移动到Out目录,反而生成了response.xml。

问题根源

你的配置同时使用了两种文件处理逻辑,导致Synapse的行为不符合预期:

  1. VFS传输层自动移动配置:你已经设置了transport.vfs.ActionAfterProcess=MOVE和transport.vfs.MoveAfterProcess参数,这会让VFS代理自动完成文件移动操作。
  2. InSequence手动发送逻辑:你在inSequence里添加了<send>指令和OUT_ONLY=true属性,这会触发Synapse生成响应实体,把原文件内容写入其中,最终以默认的response.xml文件名保存,覆盖了VFS原本的移动逻辑。

另外,你两次调用get-property('SYSTEM_DATE')生成文件名,可能会因为时间差导致日志里的文件名和实际移动的文件名不一致(虽然概率很低,但不够严谨)。

修复方案

我们需要移除冲突的手动发送逻辑,优化文件名生成逻辑,让VFS传输层的自动移动功能正常工作。修改后的配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse" name="ContractsDiscardedFileReader" startOnLoad="true" statistics="disable" trace="disable" transports="vfs">
    <target>
        <inSequence>
            <!-- 先将时间戳存储到单独属性,避免重复调用导致时间不一致 -->
            <property expression="get-property('SYSTEM_DATE', 'yyMMddHHmmss')" name="timestamp" scope="default" type="STRING"/>
            <!-- 设置重命名后的文件名 -->
            <property expression="fn:concat('DiscardedContracts', get-property('timestamp'), '.csv')" name="transport.vfs.ReplyFileName"/>
            <log separator="==-------Going to move discarded contract file in out directory---------="/>
            <log level="custom" separator="==-------File--------==">
                <property expression="get-property('transport.vfs.ReplyFileName')" name="TargetFileName"/>
            </log>
            <!-- 移除OUT_ONLY和send块,让VFS自动处理移动 -->
        </inSequence>
        <faultSequence>
            <sequence key="DeliveriesFileProcessingFaultSequence"/>
        </faultSequence>
    </target>
    <parameter name="transport.vfs.ContentType">text/plain</parameter>
    <parameter name="transport.vfs.ActionAfterProcess">MOVE</parameter>
    <parameter name="transport.vfs.CreateFolder">true</parameter>
    <parameter name="transport.vfs.MoveAfterFailure">vfs:file:///opt/file/contracts/Fail</parameter>
    <parameter name="sequential">true</parameter>
    <parameter name="transport.vfs.LockReleaseSameNode">false</parameter>
    <parameter name="transport.vfs.Build">false</parameter>
    <parameter name="transport.vfs.MoveAfterProcess">vfs:file:///opt/file/contracts/Out/</parameter>
    <parameter name="coordination">true</parameter>
    <parameter name="transport.vfs.Streaming">true</parameter>
    <parameter name="transport.PollInterval">30</parameter>
    <parameter name="transport.vfs.FileURI">vfs:file:///opt/file/mysql</parameter>
    <parameter name="transport.vfs.ActionAfterFailure">MOVE</parameter>
    <parameter name="transport.vfs.AutoLockRelease">false</parameter>
    <parameter name="transport.vfs.FileSortAttribute">lastmodifiedtimestamp</parameter>
    <parameter name="transport.vfs.FileSortAscending">true</parameter>
    <parameter name="transport.vfs.DistributedLock">false</parameter>
    <parameter name="transport.vfs.FileNamePattern">.*.csv</parameter>
    <parameter name="transport.vfs.Locking">disable</parameter>
    <description/>
</proxy>

关键修改说明

  1. 移除<send>和OUT_ONLY:让VFS传输层的MoveAfterProcess配置完全负责文件移动,避免触发响应生成逻辑。
  2. 新增timestamp属性:将时间戳预先存储,确保日志中显示的文件名和实际移动的文件名完全一致。
  3. 调整日志中的属性引用:直接使用已生成的transport.vfs.ReplyFileName属性,避免重复计算。

现在这个代理会按预期工作:每30秒轮询指定目录的CSV文件,为文件添加时间戳后,自动移动到/opt/file/contracts/Out/目录,不会生成额外的response.xml文件。如果处理失败,文件会被移动到Fail目录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:47:37