Java プログラムを使用して を作成し、javax.naming.ldap.LdapContext
それに対して操作を行う状況がありsearch()
ます。これにより、基になる接続が作成されます。次に、Java アプリ スレッドをスリープ状態にし、その間に LDAP サーバーを再起動します (OpenLDAP に注意してください)。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