java
  • timeout
  • blocking
  • nonblocking
  • 2016-02-25 2 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); 
        .... 
    

    У меня есть следующий способ входа в систему. Это зависит от LDAP. Иногда он зависает в последнем ряду. Я не знаю почему. Иногда он воспроизводит тесты производительности.Установить метод тайм-аута на поиск Ldap

    Есть ли способ подождать некоторое время, и если метод не ответил - верните некоторое предопределенное значение?

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

    ответ

    3

    Вы можете установить time-out for all Ldap operations:

    Новая среда Свойство: com.sun.jndi.ldap.read.timeout может быть использовано для указания тайм-аут чтения для операции LDAP. Значение этого свойства представляет собой строковое представление целого числа, представляющего тайм-аут чтения в миллисекундах для операций LDAP.

    Таким образом, вам просто нужно обновить метод createLdapCtx указать это переменное окружение к стоимости вашего выбора:

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

    Это приведет к поставщику услуг LDAP, чтобы прервать попытку чтения, если сервер не отвечает в течение 1 секунды. Если тайм-аут достигнут, будет выведено NamingException.


    Обратите внимание, что из this Stack Overflow post, вы не можете использовать метод SearchControls.setTimeLimit для этого, потому что это не В параметре применяется для чтения тайм-аута.

    +0

    @RealSkeptic и Tunaki поясните разница – gstackoverflow

    +0

    @gstackoverflow Это может быть не совсем правильно (я не уверен, что все жадные детали), но 'setTimeLimit' не используется для поисковых операций (и я не уверен, почему действительно) – Tunaki

    +0

    NamingException - общее исключение ldap. Я не проверял, но я думаю, что TimeLimitExceededException будет выброшено – gstackoverflow

    0

    У вашего SearchControls, скорее всего, есть способ установки таймаута. Можете ли вы проверить, не так ли? Вы должны быть в состоянии сделать ctrls.setTimeLimit(ms);

    +0

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

    Смежные вопросы