pst*_*ton 5 java ftp apache-commons
我有一个进程应该每 5 分钟将一个文件 ftp 到一个远程位置。
它似乎已经卡住了几个小时并且没有发送文件。
我进行了线程转储以查看发生了什么,这是我线程的状态:
"SPPersister" prio=6 tid=0x03782400 nid=0x16c4 runnable [0x0468f000..0x0468fd14]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
- locked <0x239ebea0> (a java.io.InputStreamReader)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
- locked <0x239ebea0> (a java.io.InputStreamReader)
at java.io.BufferedReader.readLine(Unknown Source)
at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:294)
at org.apache.commons.net.ftp.FTP._connectAction_(FTP.java:364)
at org.apache.commons.net.ftp.FTPClient._connectAction_(FTPClient.java:540)
at org.apache.commons.net.SocketClient.connect(SocketClient.java:178)
at org.apache.commons.net.SocketClient.connect(SocketClient.java:268)
...
Run Code Online (Sandbox Code Playgroud)
我正在使用以下代码进行连接:
FTPClient client = new FTPClient();
client.setConnectTimeout(10000);
client.connect(host); // <-- stuck here
client.setDataTimeout(20000);
client.setSoTimeout(20000);
client.login(user, pass);
client.changeWorkingDirectory(dir);
Run Code Online (Sandbox Code Playgroud)
连接尝试不应该在 10 秒内超时吗?
是的,也不是。
连接将在十秒内超时,假设连接不起作用,但是连接可能确实起作用,现在它正在尝试从套接字读取数据,很可能会妨碍初始 FTP helo 序列[1]。事实上,查看connectAction ()的 javadoc,这是你的堆栈跟踪被卡住的地方,这正是它正在做的事情。
您可以尝试在调用 connect 之前设置数据超时,这样它实际上可能会以您期望的方式失败。如果这不起作用,您很可能需要使用 apache-commons 提出错误。这个错误几乎肯定是您所看到的问题。
[1] 根据 RFC959:
一组重要的信息回复是连接问候语。正常情况下,当连接完成时,服务器会发送220回复“等待输入”。用户在发送任何命令之前应等待此问候消息。如果服务器无法立即接受输入,则应立即发送 120“预期延迟”回复,并在准备好时发送 220 回复。如果出现延迟,用户就会知道不要挂断电话。
这就是 FTPClient 类等待来自外部的输入的原因。
| 归档时间: |
|
| 查看次数: |
7102 次 |
| 最近记录: |