Ho una situazione in cui attraverso un programma Java, creo un javax.naming.ldap.LdapContext
e faccio un'operazione su di esso search()
- che crea una connessione sottostante. Poi metto in pausa il thread dell'app Java, durante il quale riavvio il server LDAP (OpenLDAP, solo per notare). Quando il thread dell'applicazione si riavvia e tenta di eseguire qualsiasi operazione su LdapContext
creata in precedenza, genera "CommunicationException: Connection is closed
".Come riconnettersi quando il server LDAP viene riavviato?
Quello che voglio è poter ristabilire la connessione.
Vedo che LdapContext
ha un metodo reconnect()
- in cui passo i controlli come null
. Tuttavia, questo non ha alcun effetto. Ciò che ho visto nell'implementazione LDAP di Sun durante il riavvio del server LDAP, il ConnectionPool gestito dall'implementazione Sun ha contrassegnato l'istanzasottostante con "usabile = falso". Chiamata reconnect()
: chiama semplicemente ensureOpen()
, che controlla di nuovo se il flag usable
è false
o meno - se è false
; poi lancia CommunicationException
- quindi torna al punto di partenza.
La mia domanda è: in che modo un'app Java sopravvive al riavvio di un server LDAP esterno? La creazione del nuovo LdapContext
è l'unica via d'uscita? Apprezzate eventuali approfondimenti.
Ecco StackTrace di eccezione:
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
Non penso che il problema dovrebbe venire dopo il riavvio del server se non è stato modificato alcun utente Bind. –
Ciao Imran, sfortunatamente - tutte le operazioni su LdapContext falliscono con CommunicationException, dopo che il server LDAP è stato riavviato. – Anand
Puoi condividere qualche codice, come stai creando la connessione e usandolo per cercare? –