У меня есть ситуация, когда с помощью Java-программы я создаю javax.naming.ldap.LdapContext
и выполняю над ним операцию search()
, которая устанавливает базовое соединение. Затем я помещаю поток приложений Java в спящий режим, во время которого я перезагружаю сервер LDAP (OpenLDAP, только для заметки). Когда поток приложения просыпается и пытается выполнить какую-либо операцию с LdapContext
, созданным ранее, он выдает "CommunicationException: Connection is closed
".
То, что я хочу, это возможность восстановить соединение.
Я вижу, что LdapContext
имеет метод reconnect()
- где я передаю управление как null
. Однако это не имеет никакого эффекта. То, что я увидел в реализации LDAP Sun, это то, что во время перезапуска сервера 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