异常解释:
spring-integration-sftp用信号量(Semaphore),控制对sftp的访问,当并发量过大时,会出现如上异常,我在工作中设置信号量为1,手动测试文件下载,发现有时候,无论等待多久,始终拿不到信号量。
寻找原因:
debug跟踪代码
下载文件是生成了动态代理对象,进行下载的,最终代码会走到如下位置:
进入doGet方法
原因:此处抛IO异常,但是连接没有释放,上层调用方也释放不了,所以后面无论等待多久连接始终拿不到。
综上分析spring-integration-sftp 5.3.2.RELEASE 这里会有bug。
解决方案:
1、升级spring-integration-sftp,大家自行查阅源码,后面的版本此时已经修复。
2、工作中系统暂时无法升级。
针对无法升级的解决方案:
回到此处代码,不用command模式,改用 remoteFileTemplate,实现函数式接口MessageSessionCallback里面的doInSession方法。
具体代码如下:
new DefaultMessageBuilderFactory.withPayload(inputStreamToBase64String(session.readRaw(String.valueOf(requestMessage.getPayload()))))
inputStreamToBase64String 方法可以自己实现
就是Stream流水转base64字符串。
remoteFileTemplate 对象的execute方法中会在finally释放连接,如下图: