У меня есть ситуация, когда через программу Java я создаю javax.naming.ldap.LdapContext
и выполняю над ней операцию search()
, которая создает базовое соединение. Затем я усыпляю поток Java-приложения, во время которого перезапускаю сервер LDAP (на заметку — OpenLDAP). Когда поток приложения просыпается и пытается выполнить какую-либо операцию над созданным ранее LdapContext
, он выдает "CommunicationException: Connection is closed
".
Я хочу иметь возможность восстановить соединение.
Я вижу, что у LdapContext
есть метод reconnect()
, где я передаю элементы управления как null
. Однако это не имеет никакого эффекта. Что я увидел в реализации Sun LDAP, так это то, что во время перезапуска сервера LDAP ConnectionPool, поддерживаемый реализацией Sun, помечал базовый экземпляр com.sun.jndi.ldap.LdapClient
с помощью "usable=false". При вызове reconnect()
он просто вызывает ensureOpen()
, который снова проверяет, является ли флаг usable
false
или нет - если он false
; затем он выдает CommunicationException
- так что вернемся к исходной точке.
Мой вопрос: как приложение Java выдерживает перезапуск внешнего сервера LDAP? Неужели создание новых LdapContext
снова единственный выход? Цените любые идеи.
Вот трассировка стека исключения:
javax.naming.CommunicationException: connection closed [Root exception is java.io.IOException: connection closed]; remaining name 'uid=foo,ou=People,dc=example,dc=com'
at com.sun.jndi.ldap.LdapCtx.doSearch(LdapCtx.java:1979)
at com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1824)
at com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1749)
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(ComponentDirContext.java:368)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:338)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:321)
at javax.naming.directory.InitialDirContext.search(InitialDirContext.java:248)
Caused by: java.io.IOException: connection closed
at com.sun.jndi.ldap.LdapClient.ensureOpen(LdapClient.java:1558)
at com.sun.jndi.ldap.LdapClient.search(LdapClient.java:504)
at com.sun.jndi.ldap.LdapCtx.doSearch(LdapCtx.java:1962)
... 26 more