WSO2 SFTP文件未处理直接移入Out目录问题排查
问题核心
从SFTP的in目录拾取约200个文件时,WSO2直接将部分文件移至out目录,未执行inSequence中的日志打印逻辑;即便配置逐个处理、文件间隔,K8s单/双Pod环境下问题依旧,仅SMB目录出现该问题,本地目录正常。
可能原因及排查方向
文件锁定失效:SMB协议下VFS的文件锁定逻辑和SFTP/本地系统存在差异,多Pod或多线程扫描时,部分文件未被正确锁定就被标记为已处理,直接触发移动操作。
排查:开启VFS调试日志,查看文件扫描阶段的锁定记录,确认是否存在未锁定就被处理的文件。文件状态误判:SMB目录中文件的修改/访问时间属性返回异常,VFS误判文件已稳定完成写入,跳过处理流程。
排查:添加transport.vfs.FileAge参数,设置文件需存在超过30秒才被拾取;同时检查SMB服务器的文件属性返回是否正常。传输协议配置缺失:代理的
transports仅设置了http https,未包含vfs,导致VFS传输加载不完整,部分文件处理流程异常。
修复:将transports改为vfs http https。SMB连接异常:K8s环境下SMB连接间歇性中断,读取文件时触发IO异常,但未走
ActionAfterFailure,反而执行了ActionAfterProcess。
排查:查看WSO2错误日志,确认是否有SMB相关IO异常;修正MoveAfterFailure路径(当前多了一个斜杠,应改为sftp://folder/error),同时增加transport.vfs.MaxRetryCount值。线程池溢出:200个文件批量处理时,VFS处理线程池队列溢出,部分文件直接被移动未进入序列处理。
排查:添加transport.vfs.ThreadPoolSize参数,限制并发线程数(比如设为5)。
配置修正示例
<proxy name="file_read" startOnLoad="true" transports="vfs http https" xmlns="http://ws.apache.org/ns/synapse"> <target> <inSequence> <property expression="get-property('transport', 'FILE_NAME')" name="INPUT_FILE_NAME" scope="default" type="STRING"/> <log> <property expression="$ctx:INPUT_FILE_NAME" name="Input-filename"/> </log> <respond/> </inSequence> <outSequence/> <faultSequence/> </target> <parameter name="transport.vfs.Streaming">true</parameter> <parameter name="transport.PollInterval">60</parameter> <parameter name="transport.vfs.MaxRetryCount">3</parameter> <parameter name="transport.vfs.FileURI">sftp://folder/in?sftpPathFromRoot=true&transport.vfs.AvoidPermissionCheck=true</parameter> <parameter name="transport.vfs.ContentType">text/plain</parameter> <parameter name="transport.vfs.FileProcessInterval">30000</parameter> <parameter name="transport.vfs.ActionAfterProcess">MOVE</parameter> <parameter name="transport.vfs.MoveAfterFailure">sftp://folder/error?sftpPathFromRoot=true&transport.vfs.AvoidPermissionCheck=true</parameter> <parameter name="transport.vfs.ActionAfterFailure">MOVE</parameter> <parameter name="transport.vfs.FileNamePattern">.*.csv</parameter> <parameter name="transport.vfs.MoveTimestampFormat">yyyy-MM-dd'T'HH:mm:ss_</parameter> <parameter name="transport.vfs.MoveAfterProcess">sftp://folder/out?sftpPathFromRoot=true&transport.vfs.AvoidPermissionCheck=true</parameter> <parameter name="transport.vfs.FileAge">30000</parameter> <parameter name="transport.vfs.ThreadPoolSize">5</parameter> </proxy>
内容的提问来源于stack exchange,提问作者ahinsa

