下载文件用spring-integration-sftp,出现如下异常Timed out while waiting to acquire a pool entry.

文章讲述了在使用SpringIntegrationSFTP5.3.2.RELEASE时,遇到并发访问引发的异常。作者发现信号量机制存在问题,连接未在IO异常后释放,提出升级到后续版本或使用remoteFileTemplate以确保连接在finally块中释放的解决方案。
摘要由CSDN通过智能技术生成

异常解释:

       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释放连接,如下图:

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值