问题描述
网上不少的ftp工具类,未设置超时时间,和判断是否登录成功,会引发以下问题:
问题1:使用ftpUtil下载文件,导致程序一直阻塞
问题2:ftp密码不正确,代码也会正常往下处理
问题分析
通过 jstack 进程号 > /tmp/tmp.txt 将线程的堆栈日志 写入tmp.txt文件
查看到该线程一直处于RUNNABLE状态
进入ftpclinet.connect(host,prot)方法,发现注释:
用该 socket 与服务端创建连接,并设置一个指定的超时时间,如果超时时间是0,表示超时时间为无穷大, 创建连接这个过程会进入阻塞状态,直到连接创建成功,或者发生某个异常错误
解决方法
设置超时时间:
设置控制连接连接超时的时间
○ setConnectTimeout()
设置控制连接数据读取超时的时间
○ setDefaultTimeout()
设置数据传输连接的数据读取超时的时间
○ setDataTimeout()
判断是否登录成功:
ftpClient.login未true时,才是登录成功的!
public class FtpUtil {
private static Logger logger = LoggerFactory.getLogger(FtpUtil.class);
public FtpUtil() {
}
public static boolean download(