Поддержка встроенной репликации Spring для bean-объектов сессионной области? - PullRequest
2 голосов
/ 01 декабря 2010

Я также опубликовал это на форумах Spring, но подумал, что я бы хотел дать людям здесь шанс повысить свою репутацию:

Для простых старых приложений сервлетов, работающих вВ кластерной среде (репликация / переключение сеанса) рекомендуется переустанавливать атрибуты сеанса, если они были изменены:

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

Это действует как флаг для контейнера, в котором состояние сеанса изменилось иРепликация не требуется. Вот ссылка на некоторую документацию WLS по этому вопросу.

Приложение, которое я сейчас изменяю, использует Spring для поддержки стиля разработки POJO + Injection, и мне не ясно, каквышеуказанная практика переводит.Согласно документам Spring, Скопированные компоненты в качестве зависимостей , приложение использует <aop:scoped-proxy/> для внедрения зависимости на уровне сеанса.Тем не менее, без прямого доступа к сеансу, как изменения этой зависимости помечаются для контейнера, чтобы могла происходить репликация?Есть ли что-то встроенное в прокси-сервер или веб-контекст для его поддержки?Если нет, у кого-нибудь есть примеры того, как они справляются с этим?

Спасибо за понимание.

Разъяснение, основанное на ответе axtavt :

Одной из целей проекта в следовании подходу POJO + Injection является недопущение прямой зависимости от классов Java EE или Spring.Я могу себе представить, что Spring может предоставить некоторые хуки для извлечения bean-компонентов из контекста, который может обеспечить место, по крайней мере, для отслеживания того, какие bean-объекты сессионной области были использованы.Другой возможностью может быть объявление набора методов в сессионном компоненте, который при вызове может вызвать изменение состояния.Не будучи глубоко знакомым с Spring, я могу только догадываться о том, что кажется возможным, не зная технических подробностей.

Дополнительный вопрос после просмотра некоторого кода Spring:

Может ли кто-нибудь пролить свет на роль, которую может сыграть ServletRequestAttributes?Похоже, его метод getAttribute отслеживает, какие атрибуты были получены, а затем его метод updateAccessedSessionAttributes пытается "переустановить" атрибуты, которые, по его мнению, изменились.

Ответы [ 2 ]

0 голосов
/ 08 декабря 2010

Как выяснилось, я смог поговорить с кем-то из службы поддержки SpringSource, который подтвердил, что ServletRequestAttributes является лицом, отвечающим за "переустановку".

0 голосов
/ 02 декабря 2010

Где нет встроенной поддержки для этого.

Посмотрев на код, вы можете сделать это вручную следующим образом:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...