我有一种情况,通过Java程序,我创建了一个javax.naming.ldap.LdapContext
并对其执行了一个search()
操作 - 它构成了一个基础连接。然后我让Java应用程序线程进入休眠状态,在此期间我重新启动LDAP服务器(OpenLDAP,仅供参考)。当App线程唤醒并尝试对之前创建的LdapContext
执行任何操作时,它会抛出“CommunicationException: Connection is closed
”。如何在重新启动LDAP服务器时重新连接?
我想要的是能够重新建立连接。
我看到LdapContext
有一个reconnect()
方法 - 在那里我将控件作为null
传递。但是,这没有任何影响。我在Sun LDAP实现中看到,在重新启动LDAP服务器期间,由Sun实施维护的ConnectionPool将标记为“可用= false”的底层com.sun.jndi.ldap.LdapClient
实例。在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
如果您没有更改任何绑定用户,我认为重新启动服务器后应该出现问题。 – 2012-01-09 13:05:16
不幸的是,不幸的是,在重新启动LDAP服务器之后,LdapContext上的所有操作都会因CommunicationException而失败。 – Anand 2012-01-09 16:21:50
你可以请分享一些代码,你如何创建连接并使用它来搜索? – 2012-01-10 05:20:59