今天在公司排查通过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、附原因截图
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。