2014-01-22 32 views
2

我使用Apache的FTPClient将文件上载到FTP服务器。Commons FTPClient - 如果FTP服务器不可用,storeFile()会挂起

但是,即使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

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

线程转储,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) 
+0

有关在开始storeFile()方法是什么新线程并在超时时从另一个线程中断它? – MGorgon

回答

0

我会

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

here

“两者在文件传输尝试,数据连接忙,但控制连接处于空闲状态。FTP服务器知道控制连接正在使用,所以不会通过缺少活动来关闭它,但是网络路由器很难知道控制和数据连接是相互关联的,有些路由器可能会将控制c如果通过数据连接的传输花费比路由器的允许空闲时间更长的时间,则将其断开连接。 对此的一个解决方案是通过控制连接发送安全命令(即NOOP)来重置路由器的空闲计时器。这是如下启用:”

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

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

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