2009-04-07 4 views
2

Ich möchte einige Kommentare zur Verwaltung langlebiger XMPP-Verbindungen auf einem Servlet-Container, z. B. Tomcat, hören.Verarbeiten von Logins an einen XMPP-Server über Servlets

Grundsätzlich haben wir einen Client, der Anmeldedaten an ein Servlet sendet und für jede Sitzung eine XMPPConnection erstellt und in HttpSession speichert.

Zu vereinfachend kann der Client 4 Operationen ausführen: Anmelden, Senden/Empfangen von Nachrichten, Abmelden.

(1) Wie Sie sehen können, sollte die Lebensdauer der XMPPConnection von dem Client behandelt (gesteuert) werden. In unserem Fall ist der HttpSession eine Zeitüberschreitung zugeordnet. Glaubst du, das Vertrauen auf HttpSession ist ein Fehler?

(2) Aus einer Garbage Collection Sicht ist es ein Problem, wenn die Http timed-out ist und wir rufen nicht speziell XMPPConnection.disconnect()? So wie ich es verstehe, sobald das Zeitlimit erreicht ist, werden alle Objekte im Sitzungsumfang per GC erfasst. Würde die VM die XMPPConnection verbieten und ignorieren, wenn sie immer noch verbunden ist?

(3) Was ist der Unterschied zwischen einer HttpSession Timeout und Ungültigkeitserklärung? Mein Verständnis ist, dass Timeout auf ein bestimmtes Objekt bezieht, während die Aufhebung alles entfernt.

Antwort

0

(1) Obwohl es möglicherweise bessere Möglichkeiten gibt, sehe ich nicht unbedingt ein Problem beim Speichern von XMPP-Anmeldeinformationen in der Sitzung. Ich habe kürzlich etwas Ähnliches gemacht und mich auf die HttpSession verlassen.

(2) Um Ihr Timeout-Problem zu beheben, haben Sie ein paar Optionen. Sie können das Sitzungszeitlimit in jedem Servlet, das Nachrichten sendet/empfängt (Session.setTimeout()), dynamisch festlegen, oder Sie können einen statischen Wert in der Datei web.xml angeben (ein Wert von -1 bedeutet kein Zeitlimit). Dann können Sie einen SessionListener erstellen und XMPPConnection.disconnect() für sessionDestroyed aufrufen.

+0

Danke. Schön zu wissen, dass es für Sie funktioniert (Betreff: XMPPConnection in HttpSession). Ich werde stattdessen einen SessionAttributeListener verwenden. Es sollte das gleiche Ziel erreichen. –

Verwandte Themen