首页 > 其他分享 >问题解决系列:ftp并发读取文件内容时,会出现ftp连接数过多,进而导致读取文件出现问题

问题解决系列:ftp并发读取文件内容时,会出现ftp连接数过多,进而导致读取文件出现问题

时间:2022-12-06 19:00:14浏览次数:42  
标签:ftp completePendingCommand 读取 文件 len output close null

@​​TOC​​

场景

ftp并发读取文件内容时,过了一段时候,连接数过多,进而导致读取文件出现问题,被​​ftp​​服务器给限制了。截图如下:

问题解决系列:ftp并发读取文件内容时,会出现ftp连接数过多,进而导致读取文件出现问题_连接数

环境

软件

版本

centos

7

jdk

8

问题原因

原来的操作代码如下:

InputStream in = null;
ByteArrayOutputStream output = null;
try {
in = ftpClient.retrieveFileStream(ftpFilePath);
output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024 * 4];
int len = 0;
while ((len = in.read(buffer)) != -1) {
output.write(buffer, 0, len);
}
} catch (Exception e) {
throw e;
} finally {
if (in != null) {
in.close();
}
if (output != null) {
output.close();
}
}

这个是读取文件内容到程序的变量里面去,而不落地到本地文件,减少本地IO交互。程序执行完毕之后,就会关闭对应的流。但是就是这里出现了问题,没有等待​​ftp​​​服务器返回响应,就直接关闭了流。官方解释,有几种FTPClient方法是没办法完成整个FTP命令序列,进而完成事务的。所以这些命令要求我们在收到肯定的中间命令后采取一些措施来保证整个事务的完成。而我们的代码完成其操作后,必须调用​​completePendingCommand​​来接收来自服务器的完成答复并验证整个事务是否成功。

问题解决系列:ftp并发读取文件内容时,会出现ftp连接数过多,进而导致读取文件出现问题_ftp_02

所以,问题出现的原因是没有调用​​completePendingCommand​​​来完成整个事务,导致​​ftp​​​连接频繁挂掉,然后不断重新启动新的​​ftp​​​连接,导致连接数过多,被​​ftp​​服务器给限制了。

解决方案

1. 官方方案

下面是官方提供的解决方法:

InputStream input;
OutputStream output;
input = new FileInputStream("foobaz.txt");
output = ftp.storeFileStream("foobar.txt")
if(!FTPReply.isPositiveIntermediate(ftp.getReplyCode())) {
input.close();
output.close();
ftp.logout();
ftp.disconnect();
System.err.println("File transfer failed.");
System.exit(1);
}
Util.copyStream(input, output);
input.close();
output.close();
// Must call completePendingCommand() to finish command.
if(!ftp.completePendingCommand()) {
ftp.logout();
ftp.disconnect();
System.err.println("File transfer failed.");
System.exit(1);
}

2. 本文的解决方法

在关闭流的时候,判断是否完成,以下为解决方法代码:

InputStream in = null;
ByteArrayOutputStream output = null;
try {
in = ftpClient.retrieveFileStream(ftpFilePath);
output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024 * 4];
int len = 0;
while ((len = in.read(buffer)) != -1) {
output.write(buffer, 0, len);
}
} catch (Exception e) {
throw e;
} finally {
if (in != null) {
in.close();
}
if (output != null) {
output.close();
}
if (ftp != null) {
// completePendingCommand 不能执行两次
if (!ftp.getClient().completePendingCommand()) {
log.warn("ftp 关闭连接,对应的ITEM信息如下:{}",itemInfo);
}
}
}

结果

使用命令​​netstat -an|grep :21​​​来检测​​ftp​​连接数,结果如下:

问题解决系列:ftp并发读取文件内容时,会出现ftp连接数过多,进而导致读取文件出现问题_读取文件_03

观察程序运行结果,过了一个小时,未发现异常。问题得到解决。

问题解决系列:ftp并发读取文件内容时,会出现ftp连接数过多,进而导致读取文件出现问题_ftp_04

总结

使用​​FTPClient​​的相关方法的时候,记得查看相关的文档,里面已经有比较完善的解决措施。


求赞、关注

问题解决系列:ftp并发读取文件内容时,会出现ftp连接数过多,进而导致读取文件出现问题_ftp_05


如果我的文章对大家产生了帮忙,可以在文章底部点个赞或者收藏;

如果有好的讨论,可以留言;

如果想继续查看我以后的文章,可以点击关注

也可以扫描以下二维码,关注我的公众号:枫夜之求索阁,查看我最新的分享!

问题解决系列:ftp并发读取文件内容时,会出现ftp连接数过多,进而导致读取文件出现问题_服务器_06


问题解决系列:ftp并发读取文件内容时,会出现ftp连接数过多,进而导致读取文件出现问题_读取文件_07

标签:ftp,completePendingCommand,读取,文件,len,output,close,null
From: https://blog.51cto.com/fengyege/5916452

相关文章

  • 实验六 模板类和文件IO
    1.1Vector.hpp:#include<iostream>#include<string>#include<iomanip>usingnamespacestd;template<classT>classVector{public:Vector(intn):s......
  • opensips 2.4.3 配置文件
    可以复制粘贴,命名成opensips.cfg就可以使用了##OpenSIPSresidentialconfigurationscript#byOpenSIPSSolutions<[email protected]>##Thisscriptwa......
  • java文件传输简单方法
    java文件传输简单方法假设现在已经打包了一个文件(1233444333),要将这个文件传输给另一方:importjava.io.*;publicclassF_PasswordUnPassword{publicstaticvoidmain(S......
  • 驱动设备dtsi文件
    /{ #address-cells=<1>; #size-cells=<1>; compatible="ralink,mtk7620a-soc"; cpus{ cpu@0{ compatible="mips,mips24KEc"; }; }; cpuintc:c......
  • 如何按时间周期保存或备份已处理文件?
    在使用知行之桥EDI系统时,经常会遇到根据日期查询某个文件是否已被成功处理的情况,最近运维顾问在处理客户问题时,发现很多客户都有这样的疑问,尤其是业务量较大的客户,那么如何......
  • HDFS 文件系统
    HDFS文件系统一、概述HDFS(HadoopDistributedFileSystem)是一种Hadoop分布式文件系统,具备高度容错特性,支持高吞吐量数据访问,可以在处理海量数据(TB或PB级别以上)的同时......
  • SpringBoot文件分片上传,断点续传
    ​ 1 背景用户本地有一份txt或者csv文件,无论是从业务数据库导出、还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工、挖掘和共创应用的时候,首先要将本地文......
  • 实验六 模板和文件IO
    task3_11#include<iostream>2#include<fstream>3#include<array>4#defineN556intmain(){7usingnamespacestd;89array<int,......
  • SpringMVC文件分片上传,断点续传
    ​ 一、功能性需求与非功能性需求要求操作便利,一次选择多个文件和文件夹进行上传;支持PC端全平台操作系统,Windows,Linux,Mac支持文件和文件夹的批量下载,断点续传。刷......
  • linux 给文件替换字符串/替换内容/替换某行 (shell,sed)
    本文是要讲linux不打开文档/文件的情况下,替换文本内容。打开文档,在文档/文件内替换内容的,可以用vim,可参考这篇文章vim替换文本。话题相关#linux文件替换字符串#sed字......