2014-12-17 4 views
3

Инфраструктурапроблемы сериализации использованием HazelCast с сеансом областью действия фасоли

  • JSF 2.1.17 (Mojarra)
  • Hazelcast 3.3
  • JBoss EAP 6,3

Контекст

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

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

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

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

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

Edit: боб действительно осуществляет Serializable

ответ

1

TL; DR

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

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

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

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

Смежные вопросы