【问题标题】:Commons FTPClient - storeFile() hangs, if FTP server becomes unavailableCommons FTPClient - storeFile() 挂起,如果 FTP 服务器变得不可用
【发布时间】:2014-02-13 04:18:18
【问题描述】:

我使用 Apache 的 FTPClient 将文件上传到 FTP 服务器。

然而,当我们上传文件时,即使 FTP 服务器变得不可用,storeFile() 也会挂起。 storeFile() 不会取消上传。

tcpdump 跟踪:

22:04:29.584767 IP 10.84.78.2 > 192.168.114.2:ICMP 10.84.78.2 tcp 端口 53751 不可达,长度 142

有没有办法设置超时?我已经尝试在 connect() 之后使用 setSoTimeout(),在 storeFile() 之前使用 setDataTimeout()。但是这个属性似乎与这个问题无关。

线程转储,在 FTP 服务器不可用后进行:

    "Thread-1" prio=10 tid=0x00007f1a700f1800 nid=0x479b runnable [0x00007f1a76fea000]
       java.lang.Thread.State: RUNNABLE
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
at java.io.BufferedOutputStream.write(Unknown Source)
- locked <0x00000000bb026df8> (a java.io.BufferedOutputStream)
at org.apache.commons.net.io.ToNetASCIIOutputStream.write(ToNetASCIIOutputStream.java:75)
- locked <0x00000000bb028e20> (a org.apache.commons.net.io.ToNetASCIIOutputStream)
at org.apache.commons.net.io.Util.copyStream(Util.java:111)
at org.apache.commons.net.ftp.FTPClient._storeFile(FTPClient.java:653)
at org.apache.commons.net.ftp.FTPClient.__storeFile(FTPClient.java:624)
at org.apache.commons.net.ftp.FTPClient.storeFile(FTPClient.java:1976)
at ... (FTPClient.java:103)
at ... (Sender.java:67)

netstat -anpo 输出:

netstat -anpo | grep 192

tcp6       0      0 10.84.78.2:9011         192.168.114.2:21        VERBUNDEN   19310/java       aus (0.00/0/0)
tcp6       0 201480 10.84.78.2:33088        192.168.114.2:20        VERBUNDEN   19310/java       ein (10,26/2/0)

【问题讨论】:

标签: java apache ftp


【解决方案1】:

我想试试

 ftpClient.setControlKeepAliveTimeout(300); // set timeout to 5 minutes

取自here

"在文件传输过程中,数据连接忙,而控制连接空闲。FTP服务器知道控制连接在使用中,所以不会因为缺乏活动而关闭它,但是很多网络路由器更难知道控制连接和数据连接是相互关联的。一些路由器可能会将控制连接视为空闲,如果数据连接上的传输时间超过路由器允许的空闲时间,则将其断开。 对此的一种解决方案是通过控制连接发送安全命令(即 NOOP)以重置路由器的空闲计时器。启用方式如下:"

 ftpClient.setControlKeepAliveTimeout(300); // set timeout to 5 minutes

这将导致文件上传/下载方法大约每 5 分钟发送一次 NOOP。

The following public methods support this:"
retrieveFile(String, OutputStream)
appendFile(String, InputStream)
storeFile(String, InputStream)
storeUniqueFile(InputStream)
storeUniqueFileStream(String)

【讨论】:

    猜你喜欢
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2012-05-18
    • 2019-05-21
    • 2020-01-29
    • 2014-06-18
    • 2021-04-10
    相关资源
    最近更新 更多