2011-09-22 11 views
3

Je souhaite contrôler le délai de connexion en définissant la propriété com.sun.jndi.ldap.connect.timeout. Cela fonctionne bien pour les valeurs inférieures à 1000 ms, mais si je mets des valeurs supérieures à 1000, le timeout n'augmente pas (il reste à 1000).java jndi ldap connexion timeout

Voici le code que j'ai essayé de le tester avec (le serveur est en panne):

long start = System.currentTimeMillis(); 

try 
{ 
    Hashtable env = new Hashtable(); 

    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
    env.put(Context.PROVIDER_URL, "ldap://localhost:10389"); 
    env.put(Context.SECURITY_PRINCIPAL, "uid=admin,ou=system"); 
    env.put(Context.SECURITY_CREDENTIALS, "secret"); 
    env.put("com.sun.jndi.ldap.connect.timeout", "10000"); 

    InitialLdapContext context = new InitialLdapContext(env, null); 

} catch (NamingException e) 
{ 
    System.out.println("Failed because " + e.getRootCause() 
      .getMessage() + ". Timeout: " + ((System.currentTimeMillis() - start)) + " ms."); 
} 

Que pourrait faire cela?

+0

Cela semble avoir quelque chose à voir avec le fait que j'ai défini PROVIDER_URL sur localhost. J'ai fait du débogage dans les classes java.net et j'ai découvert que le timeout était passé correctement à une méthode native. Changer le fournisseur à quelque chose d'autre que localhost le fait attendre le temps spécifié. – calin014

Répondre

2

Si l'hôte cible répond à la demande de connexion avec un code d'erreur, la connexion échoue dès que le code d'erreur est reçu. Il semble que l'hôte cible était en service et que le service LDAP cible n'écoutait pas sur le port 10389. L'hôte cible a donc répondu à la demande de connexion entrante avec un RST, de sorte qu'une exception a immédiatement été levée sur le client. C'est un comportement attendu. Vous ne voulez sûrement pas délai recevoir l'erreur? Le délai d'attente de connexion est pour le cas où l'hôte cible est temporairement inaccessible ou le service cible est vraiment occupé.