問題は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();
}