gpt4 book ai didi

java - commons net ftp死锁?

转载 作者:搜寻专家 更新时间:2023-11-01 02:34:28 26 4
gpt4 key购买 nike

我有一个进程应该每 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)
...

我正在使用以下代码进行连接:

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);

连接尝试不应该在 10 秒内超时吗?

最佳答案

是的,也不是。

连接将在十秒内超时,假设连接没有工作,但是连接可能工作了,现在它正在尝试从套接字读取数据,最有可能得到初始的 FTP helo 序列的方式[1]。的确,看着the javadoc for connectAction() ,这就是您的堆栈跟踪卡住的地方,这正是它正在做的事情。

您可以尝试设置 the data timeout在你调用 connect 之前,那样它实际上可能会以你期望的方式失败。如果这不起作用,您很可能需要 raise a bug with apache-commons . This bug几乎可以肯定是您遇到的问题。

[1] 根据 RFC959:

One important group of informational replies is the connection greetings. Under normal circumstances, a server will send a 220 reply, "awaiting input", when the connection is completed. The user should wait for this greeting message before sending any commands. If the server is unable to accept input right away, a 120 "expected delay" reply should be sent immediately and a 220 reply when ready. The user will then know not to hang up if there is a delay.

这就是 FTPClient 类等待来自外部的输入的原因。

关于java - commons net ftp死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2125350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com