Репликация состояния изменяемого объекта в распределенных веб-сеансах - PullRequest
0 голосов
/ 20 января 2020

Мне интересно, почему нет единого уведомления о важности свойства неизменяемости при хранении сериализуемых объектов в сеансе HTTP? Я попытался проверить спецификации API JSF и Servlet, но не смог найти ничего связанного.

Я видел специфическую проблему c в случае кластерного приложения на основе JSF, где управляемый компонент @SessionScoped является изменяемым т.е. измененный пользователем параметр сохраняется как поле этого управляемого компонента.

Проблема начинается, когда узел, «владеющий» сеансом (благодаря требованию липкости в спецификациях API сервлета), умирает, а другой узел начинает обслуживать сеанс, последнее состояние теряется. На самом деле, только начальное состояние реплицируется. Я полагаю, что это потому, что управляемые bean-компоненты помещаются в сеанс (и реплицируются на резервные узлы) только при первом их создании, по крайней мере это подтверждается моими тестами, выполненными на Websphere.

В то время как можно спорить, является ли это хорошим дизайном или нет, JSF и даже Servlet API все еще позволяют этому случиться.

Я также нашел некоторые примечания в Oracle документах :

Как правило, все атрибуты сеанса должны рассматриваться как неизменяемые объекты, если это возможно. Это гарантирует, что разработчики осознают, когда они меняют атрибуты. В случае изменяемых объектов изменение атрибутов часто требует двух шагов: изменение состояния объекта атрибута, а затем обновление сеанса вручную с помощью измененного объекта атрибута путем вызова javax.servlet.http.HttpSession.setAttribute () . Это означает, что ваше приложение должно всегда вызывать setAttribute () , если значение атрибута было изменено, в противном случае измененное значение атрибута не будет реплицироваться на сервер резервного копирования.

Помимо ручного обновления атрибута, как описано выше, есть ли какое-нибудь чистое решение, желательно идиоматическим образом c JSF?

1 Ответ

1 голос
/ 20 января 2020

В WebSphere Liberty есть свойство writeContents = "GET_AND_SET_ATTRIBUTES" для изменяемых объектов сеанса. Для получения дополнительной информации см .:

https://github.com/OpenLiberty/open-liberty/issues/2802

https://www.ibm.com/support/knowledgecenter/en/SSEQTP_liberty/com.ibm.websphere.liberty.autogen.nd.doc/ae/rwlp_config_httpSessionCache.html

То же свойство применяется для сохранения базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...