乐趣区

关于java:FTPClient流操作时应注意使用completePendingCommand

明天在公司排查通过 Ftp 上传数据文件、从 Ftp 下载 pdf 文件并上传至公司的云盘服务器,碰到一个问题,现将此问题记录如下:
一、程序逻辑
程序从数据库中读取一批数据,将这一批数据分组,每组的数据依照以下逻辑:
1、生成 xml 上传至 FTP 服务器
2、该 FTP 服务器下载指定名称的 pdf 文件
3、将下载回来的 pdf 文件上传至公司的云盘服务器
二、问题景象
程序第一组数据处理胜利,第二组数据处理失败,解决失败后,可从日志下面看到如下谬误提醒:
java.net.ConnectException: Connection refused (Connection refused)

at java.net.PlainSocketImpl.socketConnect(Native Method) 
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
at java.net.Socket.connect(Socket.java:589) 
at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:920) 
at org.apache.commons.net.ftp.FTPClient._retrieveFileStream(FTPClient.java:1980) 
at org.apache.commons.net.ftp.FTPClient.retrieveFileStream(FTPClient.java:1967) 

发现问题报错点是在以上“2、该 FTP 服务器下载指定名称的 pdf 文件”步骤之后,后续发动的针对 FTP 的所有操作均会报错。
三、问题代码(请疏忽编码标准,这个是他人写的代码,我帮忙排查,的确是重大不符合规范 ^.^)
1、连贯 FTP 及上传(一次连贯后,在循环外面上传和下载)

2、下载

3、上传云盘

4、敞开 FTP 连贯

四、排查后果
1、通过排查日志发现,问题报错点是在以上“2、该 FTP 服务器下载指定名称的 pdf 文件”步骤之后,代码在 ftpClient.retrieveFileStream 之后,FTP 文件服务器连贯就被敞开
2、排查官网资料,发现在读取 ftp 的流操作后,在敞开 InputStream 流之后,须要应用 ftpClient.completePendingCommand() 将 pending 的 command 完结掉才容许发动下一次操作。最终代码批改如下:

3、附起因截图

退出移动版