我使用Apache的FTPClient将文件上传到FTP服务器。
但是,当我们上传文件时,即使FTP服务器也不可用,storeFile()也会挂起。 storeFile()不会取消上传。
tcpdump trace:
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 :(得分: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)