Проблемы сериализации, используя HazelCast с сессии областью фасоли
Инфраструктура
- JSF 2.1.17 (Mojarra)
- Hazelcast 3.3
- JBoss EAP 6.3
Контекст
-
Session scoped
боб с именемLogin
, содержащий одно полеemail
. - при развертывании без
Hazelcast
Боб создается только один раз и сохраняет свои значения. - добавляя Hazelcast в приложение, мы заметили, что Боб
Login
десериализуется на каждом этапе выполнения (изменение адреса памяти и установленный адрес электронной почты не хранится).
Как мы заметили
Страница входа выдавала сообщение" поля пусты", когда они были фактически установлены. Затем мы отладили больше в этом и обнаружили, что Боб повторно создается на каждой фазе (используя PhaseListener).
Обратите внимание, что если мы изменим область Боба на запрос или представление, поля будут распознаны, но это не вариант в реальном контексте.Является ли Hazelcast переопределением способа обработки сеанса JSF бин с прицелом ? Если нет, то почему это происходит ?
Edit: Боб реализует Serializable
1 ответ:
TL; DR
Добавьте этот параметр init в веб-фильтр Hazelcast:
<init-param> <param-name>deferred-write</param-name> <param-value>true</param-value> </init-param>
При использовании репликации сеансов Hazelcast с JSF следует помнить, что каждый раз, когда ELResolver пытается получить ссылку на сеанс bean Hazelcast будет десериализовать ее для него. Вот почему Ваш логин-Боб десериализуется на каждом этапе выполнения.
Однако Hazelcast WebFilter имеет параметр под названием "отложенная запись", который, если установить значение true, кэширует экземпляр в локальную карту и передает его вы прямо оттуда. и в конце каждого http-запроса WebFilter будет записывать все значения, хранящиеся на этой карте, в Hazelcast.