Пул LdapTemplate останавливается на несколько минут во время проверки контекста - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь использовать LdapTemplate Spring-ldap для извлечения информации из источника LDAP во время реализации службы вызовов Rest, и, хотя я думаю, что у меня есть рабочая конфигурация, мы периодически замечаем задержки в 15 минут, когдасервис поражен.Операторы журналирования определили, что во время вызова ldapTemplate.search() происходит остановка.

Мои бины:

    contextSourceTarget(org.springframework.ldap.core.support.LdapContextSource) {
        urls = ["https://someldapsource.com"]
        userDn = 'uid=someaccount,ou=xxx,cn=users,dc=org,dc=com'
        password = 'somepassword'
        pooled = true
    }
    dirContextValidator(org.springframework.ldap.pool2.validation.DefaultDirContextValidator)
    poolConfig( org.springframework.ldap.pool2.factory.PoolConfig ) {
        testOnBorrow = true
        testWhileIdle = true
    }
    ldapContextSource(org.springframework.ldap.pool2.factory.PooledContextSource, ref('poolConfig')) {
        contextSource = ref('contextSourceTarget')
        dirContextValidator = ref('dirContextValidator')
    }

    ldapTemplate(LdapTemplate, ref('ldapContextSource')) {}

Я ожидаю, что это приложение может одновременно работать с LDAP несколько раз (через параллельные вызовы rest этогоприложение) для получения данных от разных пользователей.Вот код, который делает этот вызов:

    List attrs =['uid', 'otherattr1', 'otherattr2']
// this just returns a Map containing the key value pairs of the attrs passed in here.
    LdapNamedContextMapper mapper = new LdapNamedContextMapper( attrs ) 
    log.debug( "getLdapUser:preLdapSearch")
    List<Map> results = ldapTemplate.search( 
        'cn=grouproot,cn=Groups,dc=org,dc=com',
        'uniquemember=userNameImsearchingfor',
        SearchControls.SUBTREE_SCOPE, 
        attrs as String[], mapper )
    log.debug( "getLdapUser:postLdapSearch" )

К сожалению, иногда кажется, что разница в метках времени между журналами preLdapSearch и postLdapSearch превышает 15 минут.Очевидно, это плохо, и это может показаться проблемой управления пулом.

Поэтому я включил ведение журнала отладки для пакетов org.springframework.ldap и org.apache.commons.pool2

И теперь, когда это происходит, я получаю в журналах следующее:

2018-09-20 20:18:46.251 DEBUG appEvent="getLdapUser:preLdapSearch"
2018-09-20 20:35:03.246 DEBUG  A class javax.naming.ServiceUnavailableException - not explicitly configured to be a non-transient exception - encountered; ignoring.
2018-09-20 20:35:03.249 DEBUG  DirContext 'javax.naming.ldap.InitialLdapContext@1f4f37b4' failed validation with an exception.
javax.naming.ServiceUnavailableException: my.ldaphost.com:636; socket closed
at com.sun.jndi.ldap.Connection.readReply(Connection.java:454)
at com.sun.jndi.ldap.LdapClient.getSearchReply(LdapClient.java:638)
at com.sun.jndi.ldap.LdapClient.getSearchReply(LdapClient.java:638)
at com.sun.jndi.ldap.LdapClient.search(LdapClient.java:561)
at com.sun.jndi.ldap.LdapCtx.doSearch(LdapCtx.java:1985)
at com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1844)
at com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1769)
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(ComponentDirContext.java:392)
(LOTS OF STACK TRACE REMOVED)
2018-09-20 20:35:03.249 DEBUG Closing READ_ONLY DirContext='javax.naming.ldap.InitialLdapContext@1f4f37b4'
2018-09-20 20:35:03.249 DEBUG Closed READ_ONLY DirContext='javax.naming.ldap.InitialLdapContext@1f4f37b4'
2018-09-20 20:35:03.249 DEBUG Creating a new READ_ONLY DirContext
2018-09-20 20:35:03.787 DEBUG Created new READ_ONLY DirContext='javax.naming.ldap.InitialLdapContext@5239386d'
2018-09-20 20:35:03.838 DEBUG DirContext 'javax.naming.ldap.InitialLdapContext@5239386d' passed validation.
2018-09-20 20:35:03.890 DEBUG appEvent="getLdapUser:postLdapSearch"

Вопросы:

  1. Как я могу узнать больше?У меня включено ведение журнала отладки для org.springframework.ldap и org.apache.commons.pool2

  2. Почему кажется, что требуется 15 + минут, чтобы определить, что соединение устарело/ непригодным для использования?Как я могу настроить, чтобы сделать это намного короче?

1 Ответ

0 голосов
/ 21 сентября 2018

Существует высокая вероятность того, что в базовой системе LDAP возникли проблемы с подключением.Вы можете попробовать добавить таймауты в настройках пула соединений:

max-wait - по умолчанию -1
eviction-run-interval-millis - вы можете установить это, чтобы контролировать, как частопроверить наличие проблем

Документы: https://docs.spring.io/spring-ldap/docs/current/reference/#pool-configuration

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...