使用SftpOutboundGateway MGet运行时切换远程目录遇下载无响应问题
Spring Integration SFTP MGet 无法通过Header传递目录下载文件问题
问题根源
你当前的配置中,SftpOutboundGateway同时设置了mget命令的远程路径参数和remoteDirectoryExpression,导致远程路径被重复拼接,最终指向一个不存在的目录,所以没有文件被下载,且MGet在无匹配文件时默认不会抛出异常。
具体来说:
mget命令的第三个参数已经指定为headers['remoteDirectory'],即远程路径为Header传入的值- 额外设置的
setRemoteDirectoryExpression(parser.parseExpression("headers['remoteDirectory']"))会将这个值作为基础远程目录,最终远程路径变成基础目录 + 命令参数路径,也就是/home/pi/sftp/patient//home/pi/sftp/patient/,显然这个目录不存在
修正后的配置
只需要移除多余的remoteDirectoryExpression配置即可:
//SFTP Config @ServiceActivator(inputChannel = "sftpChannelMGetTest") public MessageHandler mGetHandlerTest() { ExpressionParser parser = new SpelExpressionParser(); SftpOutboundGateway gateway = new SftpOutboundGateway(sftpSessionFactory(), "mget", parser.parseExpression("headers['remoteDirectory']").getExpressionString()); gateway.setLocalDirectoryExpression(parser.parseExpression("headers['localDirectory']")); gateway.setFileExistsMode(FileExistsMode.REPLACE); // 移除下面这行多余的配置 // gateway.setRemoteDirectoryExpression(parser.parseExpression("headers['remoteDirectory']")); return gateway; }
补充说明
- MGet命令的第三个参数支持通配符,如果你需要下载目录下的所有文件,可以在传入
remoteDirectory时加上/*,比如/home/pi/sftp/patient/* - 如果需要排查这类问题,可以开启Spring Integration的DEBUG日志,查看实际拼接的远程路径和SFTP操作细节
内容的提问来源于stack exchange,提问作者Shail
相关产品推荐
相关产品推荐

