java
  • timeout
  • blocking
  • nonblocking
  • 2016-02-25 5 views 3 likes 
    3
    private Authentication authenticateUserPassword(UsernamePasswordAuthenticationToken token) throws NamingException { 
        Object login = login(token); 
        LOGGER.debug("Starting authentication login='{}'", login); 
        Object password = token.getCredentials(); 
    
        LdapContext ctx = createLdapCtx(login, password); 
        SearchControls ctrls = createSearchControls(); 
        String filter = String.format(this.filter, login); 
    
        NamingEnumeration<SearchResult> ne = ctx.search(dn, filter, ctrls); 
        .... 
    

    J'ai la méthode suivante pour connecter l'utilisateur. Cela dépend de LDAP. Parfois, il se bloque au dernier rang. Je ne sais pas pourquoi. Il se reproduit parfois sur des tests de performance.Définir le délai de la méthode sur la recherche Ldap

    Est-il possible d'attendre un certain temps et si la méthode n'a pas répondu - retourner une valeur prédéfinie?

    P.S.

    private LdapContext createLdapCtx(Object login, Object password) throws NamingException { 
        Hashtable<String, String> props = new Hashtable<String, String>(); 
        props.put(Context.INITIAL_CONTEXT_FACTORY, factory); 
        props.put(Context.PROVIDER_URL, url); 
        props.put(Context.SECURITY_AUTHENTICATION, "simple"); 
        props.put(Context.SECURITY_PRINCIPAL, String.format(domain, login)); 
        props.put(Context.SECURITY_CREDENTIALS, password.toString()); 
    
        return new InitialLdapContext(props, null); 
    } 
    

    Répondre

    3

    Vous pouvez définir un time-out for all Ldap operations:

    La nouvelle propriété de l'environnement: com.sun.jndi.ldap.read.timeout peut être utilisé pour spécifier le délai d'attente de lecture pour une opération LDAP. La valeur de cette propriété est la représentation sous forme de chaîne d'un entier représentant le délai de lecture en millisecondes pour les opérations LDAP.

    En tant que tel, il vous suffit de mettre à jour votre méthode createLdapCtx pour spécifier que la variable d'environnement à la valeur de votre choix:

    props.put("com.sun.jndi.ldap.read.timeout", "1000"); // 1 second of timeout here 
    

    Cela entraînera le fournisseur de services LDAP pour annuler la tentative de lecture si la le serveur ne répond pas dans la seconde. Si le délai d'attente est atteint, un NamingException sera généré.


    Notez que de this Stack Overflow post, vous ne pouvez pas utiliser la méthode SearchControls.setTimeLimit pour cela parce que ce paramater ne demande pas les délais d'attente de lecture.

    +0

    @RealSkeptic et Tunaki s'il vous plaît préciser la différence – gstackoverflow

    +0

    @gstackoverflow Cela peut ne pas être tout à fait correct (je ne suis pas sûr de tous les détails gourmands), mais 'setTimeLimit' n'est pas utilisé pour les opérations de recherche (et je ne sais pas vraiment pourquoi) – Tunaki

    +0

    NamingException est une exception ldap courante. Je n'ai pas vérifié mais je pense que TimeLimitExceededException sera lancé – gstackoverflow

    0

    Votre SearchControls a probablement une méthode pour définir le délai d'attente. Pouvez-vous vérifier si c'est le cas? Vous devriez être en mesure de faire un ctrls.setTimeLimit(ms);

    +0

    http://stackoverflow.com/questions/16926012/does-searchcontrols-settimelimit-handle-read-timeout – Tunaki

     Questions connexes

    • Aucun problème connexe^_^