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及上传(一次连接后,在循环里面上传和下载)
image.png
2、下载
image.png
3、上传云盘
image.png
4、关闭FTP连接
image.png
四、排查结果
1、通过排查日志发现,问题报错点是在以上“2、该FTP服务器下载指定名称的pdf文件”步骤之后,代码在ftpClient.retrieveFileStream之后,FTP文件服务器连接就被关闭
2、排查官方材料,发现在读取ftp的流操作后,在关闭InputStream流之后,需要使用ftpClient.completePendingCommand()将pending的command结束掉才允许发起下一次操作。最终代码修改如下:
image.png
3、附原因截图
image.png

阅读 357

活到老,学到老!

9 声望
0 粉丝
0 条评论
你知道吗?

活到老,学到老!

9 声望
0 粉丝
文章目录
宣传栏