2016-07-16 5 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()에 대한 호출을 제거한 경우에만 작동합니다.

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

내 시간 제한 설정 문제에 관한

, 나는 (이전에 등록 된 JCIFS에) 연결을 열 래퍼 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 

내가 랩 연결에 제한 시간을 변경하는 데 사용할 수있는 두 가지 솔루션이 있습니다. 반사와

, 나는 개인 필드 대해 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(); 
} 
관련 문제