重新启动LDAP服务器时如何重新连接?

Ana*_*and 8 java ldap exception reconnect

我有一种情况,通过Java程序,我创建一个javax.naming.ldap.LdapContext 并对其进行search()操作 - 这是一个底层连接.然后我将Java应用程序线程置于休眠状态,在此期间我重新启动LDAP服务器(OpenLDAP,只需注意).当App线程唤醒并尝试对LdapContext之前创建的任何操作进行操作时,它会抛出" CommunicationException: Connection is closed".

我想要的是能够重新建立连接.

我看到LdapContext有一个reconnect()方法 - 我将控件传递给null.但是,这没有任何效果.我在Sun LDAP实现中看到,在重新启动LDAP服务器期间,Sun实现维护的ConnectionPool com.sun.jndi.ldap.LdapClient使用"useful = 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
Run Code Online (Sandbox Code Playgroud)

Ter*_*ner 0

UnboundID LDAP SDK提供了一种自动连接方法,其中自动重新连接操作对客户端来说是不可见的。