2014-12-17 5 views
3

인프라직렬화 문제는 빈 범위

  • JSF 2.1.17 (인 Mojarra)
  • Hazelcast 3.3
  • 제이보스 EAP 6.3

상황

  • Session scopedLogin 빈은 하나의 필드 email을 포함합니다.
  • Hazelcast없이 배포하면 bean은 한 번만 인스턴스화되고 해당 값을 유지합니다.
  • 응용 프로그램에 Hazelcast를 추가 할 때마다 Login 빈이 각 실행 단계 (메모리 주소가 변경되고 설정된 전자 메일이 보관되지 않음)에서 deserialize된다는 것을 알게되었습니다.

우리는 로그인 페이지들이 실제로 설정 동안 메시지 "필드가 비어"던지고

을 발견하는 방법. 그런 다음 더 자세히 디버깅하여 Bean이 각 단계 (PhaseListener 사용)에서 다시 인스턴스화된다는 것을 알았습니다.

요청 또는보기하도록 bean 범위를 변경하면 필드는 인식되지만 실제 컨텍스트에서는 옵션이 아닙니다.

Hazelcast는 JSF가 세션 범위 Bean을 처리하는 방식을 재정의합니까? 그렇지 않다면, 왜 이런 일이 일어나고 있습니까?

편집 : 빈은 Serializable

답변

1

TL 구현하지, Hazelcast 웹 필터이 초기화 PARAM 추가 DR

을 : 당신이 Hazelcast 세션 복제를 사용할 때

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

당신은 알고 있어야를 ELResolver가 세션 빈에 대한 참조를 얻으려고 할 때마다 JSF가이를 사용하여 Hazelcast가 그를 위해 직렬화를 해제합니다. 이것이 각 실행 단계에서 로그인 빈이 deserialize되는 이유입니다.

그러나 Hazelcast WebFilter에는 "지연된 쓰기"라는 매개 변수가 있습니다.이 매개 변수는 true로 설정하면 인스턴스를 로컬 맵에 캐시하여 직접 거기에서 제공합니다. WebFilter는이 맵에 저장된 모든 값을 Hazelcast에 씁니다.