2012-01-09 12 views
8

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 
+0

Non penso che il problema dovrebbe venire dopo il riavvio del server se non è stato modificato alcun utente Bind. –

+0

Ciao Imran, sfortunatamente - tutte le operazioni su LdapContext falliscono con CommunicationException, dopo che il server LDAP è stato riavviato. – Anand

+0

Puoi condividere qualche codice, come stai creando la connessione e usandolo per cercare? –

risposta

0

Il UnboundID LDAP SDK fornisce un mezzo per la connessione automatica, in cui detta operazione di auto-riconnessione è invisibile al client.

-1

Si noti che questo è essenzialmente legato al pool di connessioni LDAP. Come definito here:

Un collegamento viene recuperata dal pool, utilizzato, restituito al pool, e quindi, nuovamente recuperata dal pool di un altro esempio di contesto.

Pertanto, il riutilizzo di un collegamento precedente può causare tale problema:

Si può verificare il comportamento senza utilizzare connessione LDAP pool modificando

com.sun.jndi.ldap.connect.pool=false 

Inoltre, un'altra possibile causa può essere il timeout della lettura delle operazioni LDAP. Infatti, l'operazione di lettura non viene notificata sulla chiusura del server LDAP dopo un timeout specifico. Per ulteriori informazioni, si può dare un'occhiata a this link

+0

Il pool di connessioni è disattivato per impostazione predefinita. Non posso dare molto senso al tuo ultimo paragrafo. Se il server si interrompe durante una lettura, verrà sicuramente notificato. – EJP

0

Abbiamo avuto questo problema al lavoro. La soluzione che ci è venuta in mente (potrebbe non essere la risposta migliore). Era quello di creare un thread watchdog che avrebbe controllato la connessione ad un tasso fisso. Se la connessione non ha funzionato, re-inizializza la connessione con LDAP.

2

Basta abilitare il pool di connessioni JNDI e sarà tutto a posto per te dietro le quinte. Vedere la Guida JNDI alle caratteristiche e la documentazione del provider LDAP. È controllato solo da un paio di proprietà.

Problemi correlati