Java 如果FTP服务器不可用,Commons FTPClient-storeFile()将挂起

Java 如果FTP服务器不可用,Commons FTPClient-storeFile()将挂起,java,apache,ftp,Java,Apache,Ftp,我使用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()之前使用setDataTi

我使用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)
我会和你一起试试

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

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

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

The following public methods support this:"
retrieveFile(String, OutputStream)
appendFile(String, InputStream)
storeFile(String, InputStream)
storeUniqueFile(InputStream)
storeUniqueFileStream(String)
在新线程中启动storeFile()方法并在超时时从另一个线程中断该方法如何?这有助于我:
 ftpClient.setControlKeepAliveTimeout(300); // set timeout to 5 minutes
The following public methods support this:"
retrieveFile(String, OutputStream)
appendFile(String, InputStream)
storeFile(String, InputStream)
storeUniqueFile(InputStream)
storeUniqueFileStream(String)