如何修复Mule 4 SFTP路径不存在需重启恢复的错误
故障根因
这个问题是Mule SFTP连接器1.3.10版本的已知缺陷,和SFTP服务端状态无关,具体触发逻辑如下:
- 连接器首次建立SFTP连接后,会缓存当前会话的工作目录句柄与路径上下文。当连接因为网络闪断、服务端空闲超时策略被服务端静默断开时,连接器内置的重连逻辑存在bug,重连成功后不会重置已缓存的失效目录上下文,仍然用旧会话的句柄访问
/source路径,就会持续抛出路径不存在的错误。 - 现有配置存在重连策略位置错误的问题:将
<reconnect-forever>写在了sftp:list组件内部,该策略仅在组件首次初始化时生效,连接池层面的失效重连不会触发该逻辑,加上外层until-successful的反复重试,会不断用携带失效上下文的连接发起请求,导致错误持续出现,直到应用重启清空所有连接缓存和上下文才会暂时恢复。
修复方案
- 优先修复连接器版本缺陷:将SFTP连接器从1.3.10升级到1.4.3及以上的稳定版本,该版本已经修复了重连后目录上下文缓存失效的问题。如果暂时无法升级连接器,可在SFTP连接配置中新增
maxIdleTime参数,将参数值设置为比SFTP服务端空闲连接超时时间短30~60秒,强制连接器在服务端断开空闲连接前主动回收连接,避免拿到失效会话。配置示例:
<sftp:connection host="${sftp.host}" port="${sftp.port}" username="${sftp.username}" identityFile="${sftp-keystore.location}" passphrase="${sftp.key.passphrase}" connectionTimeout="${sftp.connection-timeout.seconds}" responseTimeout="${sftp.response-timeout.seconds}" maxIdleTime="270000"> <!-- 假设服务端空闲超时为5分钟即300000ms,该值设为270000ms --> <reconnect-forever frequency="${sftp.reconnection.frenquency}"/> </sftp:connection>
- 调整重连策略配置位置:将原本写在
sftp:list内部的<reconnect-forever>节点移到全局SFTP配置的sftp:connection标签下,让重连策略作用于整个连接池生命周期,确保重连后会重新初始化目录上下文,不残留失效缓存。调整后sftp:list节点无需再嵌套重连配置。 - 可选增加前置校验逻辑:在执行
sftp:list操作前,先调用sftp:exists组件判断目标目录是否存在,如果校验返回不存在,主动销毁当前持有的SFTP连接,触发连接池创建新的有效连接,避免无意义的持续重试。
内容的提问来源于stack exchange,提问作者Infinity
相关产品推荐
相关产品推荐

