WSO2 ESB VFS代理无法正确移动文件至Out目录求助
解决VFS代理生成response.xml而非移动文件的问题
我来帮你分析这个问题,看起来你的VFS代理配置里存在逻辑冲突,导致文件没有按预期移动到Out目录,反而生成了response.xml。
问题根源
你的配置同时使用了两种文件处理逻辑,导致Synapse的行为不符合预期:
- VFS传输层自动移动配置:你已经设置了
transport.vfs.ActionAfterProcess=MOVE和transport.vfs.MoveAfterProcess参数,这会让VFS代理自动完成文件移动操作。 - 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>
关键修改说明
- 移除
<send>和OUT_ONLY:让VFS传输层的MoveAfterProcess配置完全负责文件移动,避免触发响应生成逻辑。 - 新增
timestamp属性:将时间戳预先存储,确保日志中显示的文件名和实际移动的文件名完全一致。 - 调整日志中的属性引用:直接使用已生成的
transport.vfs.ReplyFileName属性,避免重复计算。
现在这个代理会按预期工作:每30秒轮询指定目录的CSV文件,为文件添加时间戳后,自动移动到/opt/file/contracts/Out/目录,不会生成额外的response.xml文件。如果处理失败,文件会被移动到Fail目录。
内容的提问来源于stack exchange,提问作者Maheen Nasir
相关产品推荐
相关产品推荐

