Проблемы сериализации с использованием HazelCast с bean-компонентом в области сеанса

Инфраструктура

  • JSF 2.1.17 (Мохарра)
  • Хейзелкаст 3.3
  • JBoss EAP 6.3

Контекст

  • Session scoped bean-компонент с именем Login, который содержит одно поле email.
  • При развертывании без Hazelcast bean-компонент создается только один раз и сохраняет свои значения.
  • При добавлении Hazelcast в приложение мы заметили, что bean-компонент Login десериализуется на каждом этапе выполнения (адрес памяти меняется, а установленный адрес электронной почты не сохраняется).

Как мы заметили

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

Обратите внимание, что если мы изменим область действия компонента на запрос или просмотр, поля будут распознаны, но это не вариант в реальном контексте.

Является ли Hazelcast переопределением того, как JSF обрабатывает bean-компонент сеанса? Если нет, то почему это происходит?

Изменить: компонент реализует Serializable


person Jean-François Savard    schedule 17.12.2014    source источник


Ответы (1)


TL;DR

Добавьте этот параметр инициализации в веб-фильтр Hazelcast:

<init-param>
    <param-name>deferred-write</param-name>
    <param-value>true</param-value>
</init-param>

Вы должны знать, когда вы используете репликацию сеанса Hazelcast с JSF, что каждый раз, когда ELResolver пытается получить ссылку на сеансовый компонент, Hazelcast будет десериализовать его для него. Вот почему ваш компонент Login десериализуется на каждом этапе выполнения.

Однако у Hazelcast WebFilter есть параметр под названием «deferred-write», который, если установлено значение true, будет кэшировать экземпляр в локальную карту и отдавать его вам прямо оттуда. и в конце каждого HTTP-запроса WebFilter будет записывать все значения, хранящиеся на этой карте, в Hazelcast.

person faissalb    schedule 18.12.2014