记录FTPClient 超时处理的相关问题

apache有个开源库: commons-net,这个开源库中包括了各种基础的网络工具类,我使用了这个开源库中的FTP工具。
但碰到一些问题,并不是说是开源库的 bug,可能锅得算在产品头上吧,各种奇怪需求。

问题

当将网络限速成1KB/S时,使用commons-net开源库中的FTPClient 上传本地文件到FTP服务器上,FTPClient源码内部是通过Socket 来实现传输的,当终端和服务器建立了连接,调用storeFile()开始上传文件时,由于网络限速问题,一直没有接收到是否传输结束的反馈,导致此时,当前线程一直卡在storeFile(),后续代码一直无法执行。
如果这个时候去FTP服务器上查看一下,会发现,新创建了一个OKB的文件,但本地文件中的数据内容就是没有上传上来。
产品要求,需要有个超时处理,比如上传工作超过了30s就当做上传失败,超时处理。但我明明调用了FTPClient的相关超时设置接口,就是没有一个会生效。
—句话简述下上述的场景问题:
网络限速时,为何 FTPClient 设置了超时时间,但文件上传过程中超时机制却一直没生效?
一气之下,干脆跟进FTPClient源码内部,看看为何设置的超时失效了,没有起作用。
所以,本篇也就是梳理下FTPClient 中相关超时接口的含义,以及如何处理上述场景中的超时功能。

源码跟进

先来讲讲对FTPClient的浅入学习过程吧,如果不感兴趣,直接跳过该节,看后续小节的结论就可以了。
ps:本篇所使用的commons-net开源库版本为3.6

使用

首先,先来看看,使用FTPClient上传文件到FTP服务器大概需要哪些步骤:

当然,中间省略其他的配置项,比如设置主动模式、被动模式,设置每次读取本地文件的缓冲大小,设置文件类型,设置超时等等。但大体上,使用FTPClient来上传文件到FTP服务器的步骤就是这么几个。
既然本篇主要是想理清超时为何没生效,那么也就先来看看都有哪些设置超时的接口:

粗体字是 FTPClient类中提供的方法,而FTPClient的继承关系如下:

非粗体字的方法都是SocketClient中提供的方法。
好,先清楚有这么几个设置超时的接口存在,后面再从跟进源码过程中,一个个来了解它们。

跟进

1.connect()

那么,就先看看第一步的connect() :

所以,FTPClient调用的connect()方法其实是调用父类的方法,这个过程会去创建客户端Socket,并和指定的服务端的 ip和port创建连接,这个过程中,出现了一个connectTimeout,与之对应的FTPClient 的超时接口:;

至于内部是如何创建计时器,并在超时后是如何抛出SocketTimeoutException异常的,就不跟进了,有兴趣自行去看,这里就看—下接口的注释:

注释有大概翻译了下,总之到这里,先搞清一个超时接口的作用了,虽然从方法命名上也可以看出来了:setConnectTimeout():用于设置终端和服务器建立连接这个过程的超时时间。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

残雪飞扬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值