2012-06-11 7 views
4

При использовании ftpClient.connect с существующим хостом, у которого нет службы ftp, время ожидания происходит только через 5 минут, что слишком много.Установка таймаута подключения для FtpClient

Я пробовал устанавливать различные таймауты (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

Они предлагают реализовать собственные объекты SocketFactory с расширенным классом Socket с использованием определенного тайм-аута. Однако при попытке использовать ftpClient.setSocketFactory я также получаю java.lang.NoSuchMethodError.

Любая помощь, как уменьшить таймаут соединения?

+2

Упомянутого FAQ вопрос и ответ говорит, что: 'Так как Commons Net 1.2.x имеет J2SE требование 1,2 совместимости, в том возможность указывать тайм-аут соединения не включается. ', что означает, что библиотеки Commons Net 1.2.x не имеют желаемой функциональности. Вам нужна именно эта старая версия библиотеки? В противном случае попробуйте новую или новую версию, например. Commons Net 3.1 - там '' FTPClient'' метод 'setConnectTimeout' делает именно то, что вам нужно, как указано в ответах ниже. – Yura

+0

Я использую FTPClient 3.1, мой Eclipse не показывает ошибок, но после развертывания на сервере приложений он дает указанные ошибки. Mavne build pom.xml имеет идентичную версию зависимостей, а файл уха содержит правильную банку. – stracktracer

+2

Это действительно странно, так как это должно работать ... Вы пытались подключиться с помощью простого метода public public void main (String [] args) 'из под Eclipse? Возможно, проблема заключается в сервере приложений: она может предоставить более старую версию библиотеки Commons Net, и ваше развернутое приложение может использовать FTPClient оттуда ... – Yura

ответ

3

Хотя существует возможное решение для этой более старой версии библиотеки Commons Net, я предлагаю выяснить, почему используется неправильная версия Commons Net. Для этого вы можете включить следующий код в том месте, где 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, то он может получить более сложным, чтобы проверить путь к классам, хотя это не должно быть проблемой.

Надеется, что это помогает ...

+0

Массив состоит из 14 записей: weblogic/patch_wls1032/profiles/default/sys_manifest_classpath/weblogic_patch.jar, weblogic/jrmc-4.0.1-1.6.0/lib/tools.jar, weblogic/utils/config/10.3/config- start.jar, weblogic/wlserver_10.3/server/lib/weblogic_sp.jar, weblogic/wlserver_10.3/server/lib/weblogic.jar, ... не включая библиотеку commons-net, которую я вложил в развертывание ушей , – stracktracer

+2

Хм, это странно. Никогда не работал с weblogic, но похоже, что следующий вопрос/ответ близок к тому, что вам нужно: http://stackoverflow.com/questions/3376046/weblogic-10-3-1-0-is-using-com-bea -core-apache-commons-net-1-0-0-0-1-4-1-jar – Yura

+0

Действительно, определенная работа связана с установкой приоритета конфликтующих классов для загрузчика классов, поэтому сначала загружаются загруженные. – Alfabravo

1

Это должно быть так, как вы вызываете setConnectTimeout, потому что он существует. setConnectTimeout не является статическим вызовом, вы должны вызывать его после выделения объекта FTPClient и выполнять набор перед подключением.

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

Это именно то, что я сделал. – stracktracer

+0

Должна быть вашей настройкой. Я использую commons-net-3.0.1.jar. Я попробовал это в eclipse, чтобы убедиться. Возможно, вы захотите проверить и убедиться, что у вас не загружен более старый файл jar. – Mike

1
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) 
Смежные вопросы