2010-12-01 18 views
2

J'ai aussi posted this dans les forums de printemps, mais pensé que je donnerais des gens ici un coup à ajouter à leur réputation:Prise en charge de la réplication intégrée de Spring pour les beans de portée session?

Pour plaine d'anciennes applications servlet opérant dans un environnement en cluster (session de réplication/de basculement), il est bonnes pratiques de « re-set » session attributs si elles ont été modifiées:

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

Cela agit comme un drapeau au récipient que l'état de session a changé et la réplication est nécessaire. Here's a reference à une documentation WLS sur le sujet.

Une application que je suis en train de modifier utilise Spring pour prendre en charge un style de développement POJO + Injection et je ne comprends pas très bien comment la pratique ci-dessus se traduit. Par les documents de printemps, Scoped beans as dependencies, l'application utilise <aop:scoped-proxy/> pour injecter une dépendance de portée de session. Cependant, sans accès direct à la session, comment les modifications de cette dépendance sont-elles signalées au conteneur afin que la réplication puisse avoir lieu? Y a-t-il quelque chose intégré dans le proxy ou le contexte web pour le supporter? Si non, quelqu'un a-t-il des exemples de la façon dont il s'en occupe?

Merci pour tout commentaire.

Précisions sur la base axtavt's answer:

L'un des objectifs en suivant une approche POJO + injection du projet est d'éviter les dépendances directes soit sur Java EE ou classes de printemps. J'imagine que Spring pourrait exposer certains hameçons à la récupération de beans à partir d'un contexte qui pourrait fournir un endroit pour au moins suivre les beans de portée de session ont été utilisés. Une autre possibilité pourrait être de déclarer l'ensemble des méthodes sur le bean de portée de session qui, lorsqu'il est invoqué, pourrait déclencher un changement d'état. N'étant pas intimement familier avec le printemps, je ne peux que deviner ce que semble possible sans connaître les détails techniques.

Suivi sur la question après avoir regardé un code de printemps:

Quelqu'un peut-il faire la lumière sur le rôle que pourrait jouer ServletRequestAttributes? Il ressemble à ses pistes de méthode getAttribute dont les attributs ont été récupérés, puis sa méthode updateAccessedSessionAttributes tente de «re-définir» les attributs qui, selon lui, ont changé.

Répondre

0

Comme il se trouve, j'ai pu parler à quelqu'un du soutien SpringSource qui a vérifié que ServletRequestAttributes est l'entité en charge de la faire le "re-set".

0

Où il n'y a pas de support intégré pour cela.

En regardant le code, vous pouvez le faire manuellement comme suit:

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

Merci d'avoir pris le temps de répondre, j'ai ajouté quelques informations supplémentaires basées sur votre réponse. – kschneid