2010-12-01 12 views
2

Ich habe auch posted this in den Frühling Foren, aber ich dachte, die Leute hier eine Chance auf die zu ihren Ruf geben würde:Spring integrierte Replikationsunterstützung für session-scoped Beans?

Für einfache alte Servlet-Anwendungen in einer Cluster-Umgebung (Session-Replikation/Failover) betrieben wird, ist es gute Praxis „neu eingestellt“ Session-Attribute, wenn sie geändert habe:

UserPreferences prefs = (UserPreferences)session.getAttribute("userPreferences"); 
prefs.setInstantEmail(true); 
session.setAttribute("userPreferences", prefs); 

Dies dient als Flag auf den Container, den Sitzungszustand hat sich geändert und Replikation erforderlich. Here's a reference zu einigen WLS-Dokumentation zu diesem Thema.

Eine App, die ich gerade modifiziere, verwendet Spring, um einen POJO + -Injektionsstil der Entwicklung zu unterstützen, und mir ist nicht klar, wie sich diese Praxis übersetzen lässt. In den Spring-Dokumenten Scoped beans as dependencies verwendet die App <aop:scoped-proxy/>, um eine sitzungsabhängige Abhängigkeit zu injizieren. Wie werden Änderungen an dieser Abhängigkeit jedoch ohne direkten Zugriff auf die Sitzung dem Container angezeigt, damit die Replikation stattfinden kann? Ist etwas in den Proxy- oder den Web-Kontext integriert, um es zu unterstützen? Wenn nicht, hat jemand Beispiele dafür, wie sie damit umgehen?

Danke für jede Einsicht.

Klärung basierend auf axtavt's answer:

Eines der Ziele des Projekts eine POJO + Injektion Ansatz finden direkte Abhängigkeiten Klassen entweder auf Java EE oder Frühjahr zu vermeiden. Ich kann mir vorstellen, dass Spring einige Hooks zum Abrufen von Beans aus einem Kontext verfügbar machen könnte, der einen Ort bieten könnte, an dem zumindest verfolgt werden kann, welche Session-bezogenen Beans verwendet wurden. Eine andere Möglichkeit könnte darin bestehen, die Menge von Methoden in der Session-abhängigen Bean zu deklarieren, die, wenn sie aufgerufen wird, eine Statusänderung auslösen könnte. Da ich mit Spring nicht vertraut bin, kann ich nur vermuten, was möglich erscheint, ohne die technischen Details zu kennen.

Follow-on Frage nach irgend Frühling Code suchen:

Kann jemand etwas Licht auf die Rolle vergießen, dass ServletRequestAttributes spielen könnte? Es sieht so aus, als ob seine getAttribute-Methode verfolgt, welche Attribute abgerufen wurden, und dann versucht die updateAccessedSessionAttributes-Methode, die Attribute, von denen angenommen wird, dass sie sich geändert haben, zu "re-set".

Antwort

0

Wie sich herausstellt, ich in der Lage war, jemanden von Springsource Unterstützung zu sprechen, der Nachweis erbracht, dass ServletRequestAttributes ist die Stelle, die für tun die "neu einstellen".

0

Wo ist keine integrierte Unterstützung dafür.

Von den Code suchen, können Sie es manuell tun, wie folgt:

RequestAttributes a = RequestContextHolder.currentRequestAttributes(); 
String name = ScopedProxyUtils.getTargetBeanName("...your bean name...") 
synchronized (a.getSessionMutex()) { 
    Object o = a.getAttribute(name, RequestAttributes.SCOPE_SESSION); 
    a.setAttribute(name, o, RequestAttributes.SCOPE_SESSION); 
} 
+0

Vielen Dank, dass Sie sich die Zeit genommen haben zu antworten, ich habe einige zusätzliche Informationen basierend auf Ihrer Antwort hinzugefügt. – kschneid

Verwandte Themen