Wie wird die Verbindung wiederhergestellt, wenn der LDAP-Server neu gestartet wird?

8

Ich habe eine Situation, in der ich durch ein Java-Programm eine javax.naming.ldap.LdapContext und eine search() -Operation darauf anlege - was eine zugrundeliegende Verbindung herstellt. Dann lege ich den Java-App-Thread in den Ruhezustand, währenddessen starte ich den LDAP-Server neu (OpenLDAP, nur um es zu merken). Wenn der App-Thread aufwacht und versucht, eine Operation für das zuvor erstellte LdapContext auszuführen, wird " CommunicationException: Connection is closed " ausgegeben.

Ich möchte die Verbindung wiederherstellen können.

Ich sehe, dass LdapContext eine reconnect() Methode hat - wo ich Kontrollen als null übergebe. Dies hat jedoch keine Auswirkungen. Was ich in der Sun LDAP-Implementierung gesehen habe, war, dass während der Zeit, als der LDAP-Server neu gestartet wurde, das von der Sun-Implementierung verwaltete ConnectionPool die zugrunde liegende com.sun.jndi.ldap.LdapClient -Instanz mit einem "usable = false" markierte. Nach reconnect() call - es ruft einfach ensureOpen() auf, was wiederum prüft, ob das usable -Flag false ist oder nicht - wenn es false ist; dann wirft es CommunicationException - also zurück auf Platz eins.

Meine Frage ist: Wie übersteht eine Java App einen externen Neustart des LDAP-Servers? Ist die Erstellung von neuem LdapContext wieder der einzige Ausweg? Schätze alle Einsichten.

Hier ist der Stacktrace der Ausnahme:

%Vor%     
Anand 09.01.2012, 11:17
quelle

4 Antworten

2

Aktivieren Sie einfach das JNDI-Verbindungs-Pooling, und hinter den Kulissen wird alles für Sie erledigt. Weitere Informationen finden Sie im JNDI-Handbuch zu Features und in der LDAP-Provider-Dokumentation. Es wird von nur ein paar Eigenschaften gesteuert.

    
EJP 04.08.2013 00:56
quelle
0
___ qstntxt ___

Ich habe eine Situation, in der ich durch ein Java-Programm eine %code% und eine %code% -Operation darauf anlege - was eine zugrundeliegende Verbindung herstellt. Dann lege ich den Java-App-Thread in den Ruhezustand, währenddessen starte ich den LDAP-Server neu (OpenLDAP, nur um es zu merken). Wenn der App-Thread aufwacht und versucht, eine Operation für das zuvor erstellte %code% auszuführen, wird " %code% " ausgegeben.

Ich möchte die Verbindung wiederherstellen können.

Ich sehe, dass %code% eine %code% Methode hat - wo ich Kontrollen als %code% übergebe. Dies hat jedoch keine Auswirkungen. Was ich in der Sun LDAP-Implementierung gesehen habe, war, dass während der Zeit, als der LDAP-Server neu gestartet wurde, das von der Sun-Implementierung verwaltete ConnectionPool die zugrunde liegende %code% -Instanz mit einem "usable = false" markierte. Nach %code% call - es ruft einfach %code% auf, was wiederum prüft, ob das %code% -Flag %code% ist oder nicht - wenn es %code% ist; dann wirft es %code% - also zurück auf Platz eins.

Meine Frage ist: Wie übersteht eine Java App einen externen Neustart des LDAP-Servers? Ist die Erstellung von neuem %code% wieder der einzige Ausweg? Schätze alle Einsichten.

Hier ist der Stacktrace der Ausnahme:

%Vor%     
___ qstnhdr ___ Wie wird die Verbindung wiederhergestellt, wenn der LDAP-Server neu gestartet wird? ___ answer14814317 ___

Sie sollten beachten, dass dies im Wesentlichen mit dem LDAP-Verbindungspooling zusammenhängt. Wie definiert hier :

  

Eine Verbindung wird aus dem Pool abgerufen, verwendet, an den Pool zurückgegeben und dann erneut aus dem Pool für eine andere Contextinstanz abgerufen.

Daher kann die Wiederverwendung einer vorherigen Verbindung zu folgendem Problem führen:

Sie können das Verhalten testen, ohne das LDAP-Verbindungspooling zu verwenden, indem Sie

festlegen %Vor%

Eine weitere mögliche Ursache könnte das Zeitlimit beim Lesen der LDAP-Vorgänge sein. Tatsächlich wird die Leseoperation nach einem bestimmten Timeout nicht über das Schließen des LDAP-Servers informiert. Weitere Informationen finden Sie in diesem Link

    
___ answer18035866 ___

Wir hatten dieses Problem bei der Arbeit. Die Lösung, die wir uns ausgedacht haben (ist vielleicht nicht die beste Antwort). Wurde ein Watchdog-Thread erstellt, der die Verbindung mit einer bestimmten Rate überprüfen würde. Wenn die Verbindung nicht funktioniert hat, wird die Verbindung mit LDAP neu initialisiert.

    
___ tag123exception ___ Eine Ausnahme ist eine ungewöhnliche Bedingung, die eine Abweichung vom normalen Ablauf des Programms erfordert. Normalerweise sollte eine Ausnahme nicht zu einem Totalausfall führen, sondern stattdessen von einem Ausnahmebehandler begleitet werden. Die Ausnahmebehandlung ist ein eingebautes Konstrukt in vielen Programmiersprachen. In der Regel werden Ausnahmen behandelt, indem der Stapel abgewickelt wird und somit in einen definierten Zustand außerhalb des Gültigkeitsbereichs der Ausnahme zurückversetzt wird und dann ein Verarbeitungsblock oder eine Routine aufgerufen wird. ___ answer18038775 ___

Aktivieren Sie einfach das JNDI-Verbindungs-Pooling, und hinter den Kulissen wird alles für Sie erledigt. Weitere Informationen finden Sie im JNDI-Handbuch zu Features und in der LDAP-Provider-Dokumentation. Es wird von nur ein paar Eigenschaften gesteuert.

    
___ tag123reconnect ___ hilf uns dieses Wiki zu bearbeiten ___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ tag123ldap ___ LDAP (Lightweight Directory Access Protocol) ist ein Anwendungsprotokoll für den Zugriff auf und die Verwaltung verteilter Verzeichnisinformationsdienste über ein IP-Netzwerk. ___
Terry Gardner 09.01.2012 13:55
quelle
0

Wir hatten dieses Problem bei der Arbeit. Die Lösung, die wir uns ausgedacht haben (ist vielleicht nicht die beste Antwort). Wurde ein Watchdog-Thread erstellt, der die Verbindung mit einer bestimmten Rate überprüfen würde. Wenn die Verbindung nicht funktioniert hat, wird die Verbindung mit LDAP neu initialisiert.

    
lordoku 03.08.2013 18:17
quelle
-1

Sie sollten beachten, dass dies im Wesentlichen mit dem LDAP-Verbindungspooling zusammenhängt. Wie definiert hier :

  

Eine Verbindung wird aus dem Pool abgerufen, verwendet, an den Pool zurückgegeben und dann erneut aus dem Pool für eine andere Contextinstanz abgerufen.

Daher kann die Wiederverwendung einer vorherigen Verbindung zu folgendem Problem führen:

Sie können das Verhalten testen, ohne das LDAP-Verbindungspooling zu verwenden, indem Sie

festlegen %Vor%

Eine weitere mögliche Ursache könnte das Zeitlimit beim Lesen der LDAP-Vorgänge sein. Tatsächlich wird die Leseoperation nach einem bestimmten Timeout nicht über das Schließen des LDAP-Servers informiert. Weitere Informationen finden Sie in diesem Link

    
Oueslati Bechir 11.02.2013 14:40
quelle

Tags und Links