1

我正在使用 Commons NetFTPClient类定期轮询 ftp 站点并尝试下载文件。有时线程在尝试从站点读取时会无限期阻塞,我想知道是否有其他人遇到过这个问题并且可以提供任何解决方法?

我正在使用FTPClient'sretrieveFileStream(String)方法获取 InputStream 的句柄,然后我尝试从中读取。下面是被阻塞线程的部分堆栈跟踪。

"FTP File Poll Thread" prio=10 tid=0x083b0800 nid=0x6324 runnable [0x65b5b000..0x65b5beb0]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:129)
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:237)
        - locked <0x5c851928> (a java.io.BufferedInputStream)
        at java.io.FilterInputStream.read(FilterInputStream.java:66)
        at java.io.PushbackInputStream.read(PushbackInputStream.java:122)
        at org.apache.commons.net.io.FromNetASCIIInputStream.__read(FromNetASCIIInputStream.java:75)
        at org.apache.commons.net.io.FromNetASCIIInputStream.read(FromNetASCIIInputStream.java:170)
        at java.io.FilterInputStream.read(FilterInputStream.java:116)
4

2 回答 2

1

java.io 是阻塞的,你需要使用 java.nio 包。从未将 ftp 与 java.nio 一起使用,但假设它必须工作,因为 http 可以与 java.nio 一起工作。

问候

于 2009-11-16T20:04:42.927 回答
0

我最终在这里使用的 kludge 是安排一个任务,如果 FTP 操作花费的时间超过 X 秒,则发出警报。我确实在 Sourceforge 上找到了 javanioftp,但在我的情况下,它不保证切换客户端的开发开销。

于 2009-11-17T08:45:38.350 回答