我有一种情况,通过 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
实例标记为“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