2016-07-16 1 views
0

J'ai défini responseTimeout et soTimeout sur 15000ms mais j'ai quand même un timeout de après 90000ms. J'ai testé cela sur les versions 1.3.18 et 1.3.1.17.La temporisation définie avec jcifs ne fonctionne pas

Lorsque je ne suis pas enregistrer jcifs mon délai d'attente par défaut pour HttpURLConnection se produit correctement après 15000ms:

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

Mais quand je me inscrire jcifs alors le timout se produit après 90000ms:

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

Il semble que le délai d'attente jcifs et mon délai d'attente par défaut sont tous deux ignorés pour une autre valeur.

J'ai aussi essayé setProperty directement sur Config, mais il ne change pas:

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

Répondre

2

(Ce message a été envoyé jcifs forum à http://thread.gmane.org/gmane.network.samba.java/9554)

Pour moi, le problème est que jcifs enveloppements une nouvelle HttpURLConnection afin qu'il perd tous les paramètres définis sur la connexion d'origine, comme les paramètres de délai d'attente. Pour le prouver soit j'utilise la réflexion ou je modifie la bibliothèque et change la connexion interne de jcifs, alors le timeout fonctionne bien.

(Pour plus d'informations et la mise en jcifs.smb.client.responseTimeout jcifs.smb.client.soTimeout ne fonctionne pas)

D'abord, je certifie que jcifs est le problème: mon délai de 15000ms ne fonctionne pas du tout lorsque j'utilise jcifs.Config.registerSmbURLHandler(), la connexion se rompt après 30000ms. Mon délai d'attente de 15000ms ne fonctionne que si je supprime l'appel à registerSmbURLHandler().

En ce qui concerne le problème, j'ouvrir une connexion (avec jcifs précédemment enregistrés):

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

Puis le URLStreamHandler crée un NtlmHttpURLConnection d'emballage et se cache le vrai HttpURLConnection:

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

donc mes paramètres de temporisation sont appliquées à l'enveloppe NtlmHttpURLConnection, elle n'est pas appliquée à l'URLConnection ouverte vraie. Donc, mon délai d'attente sont inutiles:

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 

Il y a deux solutions que je peux utiliser pour modifier le délai d'attente sur la connexion enveloppé: avec la réflexion ou avec une bibliothèque fixe.

Avec réflexion, j'accéder à la connexion privée enveloppé et de changer les champs privés connectTimeout et 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); 

Ou je modifie la bibliothèque jcifs et le constructeur NtlmHttpURLConnection():

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

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

    requestProperties = new HashMap(); 
}