WSO2中SFTP文件写入后获取文件大小及重试实现方案
使用VFS写入SFTP后获取文件大小并实现重试逻辑
核心问题解答
使用VFS完成SFTP文件写入后,可以获取目标文件的大小属性,不过默认不会自动将该属性注入到消息上下文里,需要通过额外配置或逻辑读取文件元数据,以此判断写入是否成功并触发重试。
具体实现方案
1. 写入后读取文件大小
在文件写入的<call>节点之后,添加读取目标文件元数据的逻辑,通过VFS组件获取文件大小。以Apache Camel为例,VFS组件会在读取文件时自动填充CamelFileLength消息头,该字段即为文件的字节大小。
2. 基于文件大小触发重试
通过retryWhile机制判断文件大小是否有效:若file-size属性为空或等于0,则重复执行写入和校验逻辑,直到条件不满足或达到重试上限。
修改后的示例配置
<route> <!-- 原SFTP写入逻辑 --> <call> <endpoint> <address uri="vfs:sftp://{username}:{password}@{host/path}"> <timeout> <duration>60000</duration> </timeout> <suspendOnFailure> <initialDuration>1000</initialDuration> <progressionFactor>2</progressionFactor> <maximumDuration>60000</maximumDuration> </suspendOnFailure> <markForSuspension> <retriesBeforeSuspension>3</retriesBeforeSuspension> <retryDelay>1</retryDelay> </markForSuspension> </address> </endpoint> </call> <!-- 读取已写入文件的大小 --> <setHeader headerName="CamelFileName"> <simple>${header.CamelFileName}</simple> <!-- 传递写入时的文件名 --> </setHeader> <to uri="vfs:sftp://{username}:{password}@{host/path}?operation=get&fileName=${header.CamelFileName}&readLock=none"/> <setHeader headerName="file-size"> <simple>${in.header.CamelFileLength}</simple> </setHeader> <!-- 文件大小无效则重试 --> <retryWhile> <simple>${header.file-size} == null || ${header.file-size} == 0</simple> </retryWhile> </route>
关键说明
CamelFileLength是VFS组件内置的消息头,读取文件时自动生成,直接对应文件字节数。retryWhile会循环执行写入+校验逻辑,直到文件大小有效或触发重试上限。- 需确保
CamelFileName消息头正确传递,否则无法精准定位到刚写入的目标文件。
内容的提问来源于stack exchange,提问作者Ruby
相关产品推荐
相关产品推荐

