设置FtpClient的连接超时

时间:2012-06-11 12:14:38

标签: java ftp-client apache-commons-net

ftpClient.connect与没有活动ftp服务的现有主机一起使用时,超时仅在5分钟后发生,这太长了。

我尝试设置不同的超时(setDefaultTimeout,setDataTimeout),但没有改变任何内容。

FtpClient继承自SocketClient,它有一个setConnectTiemout方法,但是当我使用它时,我在运行时得到java.lang.NoSuchMethodError: org/apache/commons/net/ftp/FTPClient.setConnectTimeout。这似乎是因为一些J2SW 1.2兼容性,如Commons-net FAQ中所述:

问:如何设置连接超时? http://wiki.apache.org/commons/Net/FrequentlyAskedQuestions

他们建议使用特定的超时从扩展的Socket类中实现自己的SocketFactory创建对象。但是,在尝试使用ftpClient.setSocketFactory时,我也会获得java.lang.NoSuchMethodError

如何减少连接超时的任何帮助?

4 个答案:

答案 0 :(得分:3)

虽然可能有旧版Commons Net库的解决方案,但我建议弄清楚为什么使用错误版本的Commons Net。为此,您可以将以下代码包含在您的webapp中使用FTPClient的位置:

FTPClient ftpClient = ...;
if(ftpClient.getClass().getClassLoader() instanceof java.net.URLClassLoader) {
    URL[] urls = ((java.net.URLClassLoader) ftpClient.getClass().getClassLoader()).getURLs();
    // log these urls somewhere and check - these are urls from where your FTPClient may be loaded from
}

如果FTPClient加载的java.net.URLClassLoader不是{{1}},那么检查类路径会变得更复杂,尽管这不应该是一个问题。

希望这会有所帮助......

答案 1 :(得分:2)

它必须与调用setConnectTimeout的方式相同,因为它确实存在。 setConnectTimeout不是静态调用,必须在分配FTPClient对象并在连接之前执行set之后调用它。

FTPClient ftp = new FTPClient();
ftp.setConnectTimeout(5000); // 5000 Milliseconds (5 Seconds)
... 
ftp.connect(server, port); 

答案 2 :(得分:2)

    FTPClient ftp = new FTPClient();

    ftp.setDefaultTimeout();
    ftp.setDataTimeout();
    ftp.setConnectTimeout();
    ftp.setSoTimeout();
    ftp.setControlKeepAliveTimeout();
    ftp.setControlKeepAliveReplyTimeout();

来自Apache docs:

   /**
     * Set the default timeout in milliseconds to use when opening a socket.
     * This value is only used previous to a call to
     * {@link #connect connect()}
     * and should not be confused with {@link #setSoTimeout setSoTimeout()}
     * which operates on an the currently opened socket.  _timeout_ contains
     * the new timeout value.
     * <p>
     * @param timeout  The timeout in milliseconds to use for the socket
     *                 connection.
     */
    void setDefaultTimeout(int timeout);


    /**
     * Sets the timeout in milliseconds to use when reading from the
     * data connection.  This timeout will be set immediately after
     * opening the data connection, provided that the value is &ge; 0.
     * <p>
     * <b>Note:</b> the timeout will also be applied when calling accept()
     * whilst establishing an active local data connection.
     * @param  timeout The default timeout in milliseconds that is used when
     *        opening a data connection socket. The value 0 means an infinite timeout.
     */
    void setDataTimeout(int timeout)
    /**
     * Sets the connection timeout in milliseconds, which will be passed to the {@link java.net.Socket} object's
     * connect() method.
     * @param connectTimeout The connection timeout to use (in ms)
     * @since 2.0
     */
    void setConnectTimeout(int connectTimeout);
    /**
     * Set the timeout in milliseconds of a currently open connection.
     * Only call this method after a connection has been opened
     * by {@link #connect connect()}.
     * <p>
     * To set the initial timeout, use {@link #setDefaultTimeout(int)} instead.
     *
     * @param timeout  The timeout in milliseconds to use for the currently
     *                 open socket connection.
     * @exception SocketException If the operation fails.
     * @throws NullPointerException if the socket is not currently open
     */
    void setSoTimeout(int timeout) throws SocketException;
    /**
     * Set the time to wait between sending control connection keepalive messages
     * when processing file upload or download.
     *
     * @param controlIdle the wait (in secs) between keepalive messages. Zero (or less) disables.
     * @since 3.0
     * @see #setControlKeepAliveReplyTimeout(int)
     */
    void setControlKeepAliveTimeout(long controlIdle);

    /**
     * Set how long to wait for control keep-alive message replies.
     *
     * @param timeout number of milliseconds to wait (defaults to 1000)
     * @since 3.0
     * @see #setControlKeepAliveTimeout(long)
     */
    void setControlKeepAliveReplyTimeout(int timeout)

答案 3 :(得分:0)

只是为这些值添加一些说明(在手动测试了很多组合之后,并且只是提到这与在 apache Function LastPredecessorV2(PreList As String, EndDates As Range, IDColumn As Range) As Date Dim Preds() As String, PredDates() As Long Preds = Split(Replace(PreList, " ", ""), ",") ReDim PredDates(UBound(Preds)) For i = LBound(Preds) To UBound(Preds) PredDates(i) = IDColumn.Find( _ What:=CInt(Preds(i)), _ LookAt:=xlWhole _ ).Offset(0, EndDates.Column - IDColumn.Column).Value2 'Corrected Next i LastPredecessorV2 = CDate(Application.WorksheetFunction.Max(PredDates)) End Function 下使用的 spring DefaultFtpSessionFactory 有关 - 所以最后适用于那个):

FTPClient