2016-07-16 18 views
0

私はresponseTimeoutとsoTimeoutを15000msに設定しましたが、90000ms後にはまだ タイムアウトになります。jcifsでタイムアウトが定義されていません

私はこれをv1.3.18とv1.3.17でテストしました。

のHttpURLConnectionが15000ms後に正しく を発生するために、私は私のデフォルトのタイムアウトをJCIFS登録していないとき:

connection.setReadTimeout(15000); 
connection.setConnectTimeout(15000); 

しかし、私はJCIFSを登録するときにTIMOUTが90000ms後に発生します。それはそう

System.setProperty("jcifs.smb.client.responseTimeout", "15000"); 
System.setProperty("jcifs.smb.client.soTimeout", "15000"); 
jcifs.Config.registerSmbURLHandler(); 
[...] 
connection.setReadTimeout(15000); 
connection.setConnectTimeout(15000); 

jcifsのタイムアウトと私のデフォルトのタイムアウトは、別の値である のために無視されます。

は、私はまた、直接コンフィグ上のsetPropertyを試してみましたが、それは変更されません:

jcifs.Config.setProperty("jcifs.smb.client.responseTimeout", "15000"); 
jcifs.Config.setProperty("jcifs.smb.client.soTimeout", "15000"); 

答えて

2

問題はJCIFSは新しいラップということである私にとって

(このメッセージはhttp://thread.gmane.org/gmane.network.samba.java/9554でフォーラムをJCIFSに投稿されました) HttpURLConnectionはタイムアウト設定のように元の接続で定義されたすべての設定を失います。これを証明するために、リフレクションを使用するか、ライブラリを変更してjcifsの内部接続を変更してください。タイムアウトが正常に機能します。

(jcifs.smb.client.responseTimeoutとjcifs.smb.client.soTimeoutの設定情報が機能しないために)

まず、私はJCIFSが問題であることを検証:15000msの私のタイムアウトはまったく機能しません。 jcifs.Config.registerSmbURLHandler()を使用すると、30000ms後に接続が切断されます。私の15000msのタイムアウトは、registerSmbURLHandler()への呼び出しを削除した場合にのみ機能します。問題について

は、私は(以前に登録JCIFSとの)接続を開きます。

URLConnection myConnection = new URL(url).openConnection(); 

はその後URLStreamHandlerのはラッピングNtlmHttpURLConnectionを作成し、実際のHttpURLConnectionの隠し:

protected URLConnection openConnection(URL url) throws IOException { 
    url = new URL(url, url.toExternalForm(), 
      getDefaultStreamHandler(url.getProtocol())); 
    return new NtlmHttpURLConnection((HttpURLConnection) 
      url.openConnection()); 
} 

だから私のタイムアウト設定をラッパーNtlmHttpURLConnectionに適用されますが、実際に開いたURLConnectionには適用されません。だから私のタイムアウトが役に立たない:反射または固定されたライブラリーで:

myConnection.setReadTimeout(15000); // applied to the new NtlmHttpURLConnection(wrapped), not the real wrapped one 
myConnection.setConnectTimeout(15000); // applied to the new NtlmHttpURLConnection(wrapped), not the real wrapped one 

私はラップの接続にタイムアウトを変更するために使用できる2つのソリューションがあります。反射して

、私はプライベートラップ接続にアクセスし、民間分野のconnecttimeoutとreadTimeout変更:

Class<?> classConnection = myConnection.getClass(); 

Field privateFieldURLConnection = classConnection.getDeclaredField("connection"); 
privateFieldURLConnection.setAccessible(true); 

URLConnection privateURLConnection = (URLConnection) privateFieldURLConnection.get(myConnection); 
Class<?> classURLConnectionPrivate = privateURLConnection.getClass(); 

Field privateFieldConnectTimeout = classURLConnectionPrivate.getDeclaredField("connectTimeout"); 
privateFieldConnectTimeout.setAccessible(true); 
privateFieldConnectTimeout.setInt(privateURLConnection, 15000); 

Field privateFieldReadTimeout = classURLConnectionPrivate.getDeclaredField("readTimeout"); 
privateFieldReadTimeout.setAccessible(true); 
privateFieldReadTimeout.setInt(privateURLConnection, 15000); 

それともJCIFSライブラリーとコンストラクタNtlmHttpURLConnectionを(変更を):

public NtlmHttpURLConnection(HttpURLConnection connection) { 
    super(connection.getURL()); 
    this.connection = connection; 

    this.connection.setReadTimeout(15000); 
    this.connection.setConnectTimeout(15000); 

    requestProperties = new HashMap(); 
} 
関連する問題