Проблемы сериализации, используя 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 3

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.