문제

내가 이해하는 서블릿에 따르면 서블릿은 컨테이너에 의해 인스턴스화됩니다. init() 메소드는 한 번 호출되며 서블릿은 JVM이 종료될 때까지 싱글톤처럼 유지됩니다.

내 서블릿은 직렬화될 것으로 예상하지 않습니다. 앱 서버가 복구되거나 정상적으로 시작될 때 새로 생성되기 때문입니다.서블릿은 세션별 멤버를 보유하지 않아야 하므로 디스크에 기록하고 다시 인스턴스화하는 것은 의미가 없습니다.이것에 대한 실제적인 용도가 있습니까?

내 우려는 직렬화할 수 없는 필드를 거기에 넣으면 다른 종류의 세션 복제가 발생하는 프로덕션 환경에서 내 앱이 이상하게 실패할 것이라는 점입니다.

도움이 되었습니까?

해결책

기술적으로, 나는 서블릿 컨테이너가 EJB 세션 Bean과 비슷한 방식으로 서블릿 객체를 디스크로 "통행"할 수 있다고 생각합니다. 따라서, 당신은 비 서리 화 할 수없는 필드로 인해 앱이 실패하는지 질문하는 것이 맞습니다.

실제로, 나는 이것을하는 컨테이너에 대해 들어 본 적이 없기 때문에 실제로 J2EE 초기의 나쁜 시절의 유산 수하물 일뿐입니다. 나는 그것에 대해 걱정하지 않을 것입니다.

다른 팁

httpservlet은 직렬화되어 디스크를 디스크하고 서블릿 컨테이너의 다시 시작해야합니다. 예를 들어 Tomcat을 사용하면 이런 종류의 생존을 가능하게하는 플래그를 설정할 수 있습니다. 다음 옵션은 JNDI를 사용하여 전송하는 것입니다. 이것은 쓰레기가 아니며 극한의 사용 사례에서만 사용됩니다.

Google은 컨테이너 저자가 원하는 경우 옵션을 가질 수 있도록 이것이 수행되었다고 제안하는 것 같습니다.

당신은 서블릿이 세션 별 회원을 보유하지 않아야한다는 것이 맞습니다. 사실 나는 당신이 가능한 한 적은 상태를 원한다고 생각합니다. 세션이나 ServletConfig에 모든 것을 저장하면 직렬화에서 살아남을 수 있다고 생각합니다.

세션 객체가 클러스터 옵션을 제공하는 ServletContainers의 캐시에서 생존하기 위해 직렬화되는 것처럼, 컨테이너가 서블릿 인스턴스를 다른 클러스터 노드로 전송할 수있는 옵션이있을 수 있습니까 ?? 나는 단지 여기서 추측하고있다

직렬화 가능은 다음과 같이 사용됩니다. 마커 인터페이스 분산 환경의 세션 속성에 대한 것입니다.

SRV.7.7.2 분산 환경(JSR-154)

다음으로 표시된 애플리케이션 내에서 배포 가능, 세션의 일부인 모든 요청은 한 번에 하나의 Java 가상 머신 ( "JVM")에 의해 처리되어야합니다.컨테이너는 stattribute 또는 putvalue 메소드를 적절하게 사용하여 httpsession 클래스의 인스턴스에 배치 된 모든 객체를 처리 할 수 ​​있어야합니다.이러한 조건을 충족시키기 위해 다음과 같은 제한이 부과됩니다.

  • 컨테이너는 직렬화 가능 인터페이스를 구현하는 객체를 허용해야 합니다..
  • 세션 마이그레이션은 컨테이너별 시설에서 처리됩니다.

분산 된 서블릿 컨테이너는 컨테이너는 세션을 저장하는 데 필요한 메커니즘을 지원할 수 없습니다..

분산 된 서블릿 컨테이너는 필요한 메커니즘을 지원해야합니다. 직렬화 가능을 구현하는 객체 마이그레이션.

(...)

컨테이너 제공 업체는로드 밸런싱 및 장애 조치와 같은 확장 성 및 서비스 품질 기능을 보장 할 수 있습니다. 분산 시스템의 활성 노드에서 시스템의 다른 노드로 세션 객체와 그 내용을 이동할 수 있습니다. 분포 된 컨테이너 인 경우 세션 유지 또는 마이그레이션 서비스 품질 기능을 제공하기 위해 httpsessions 및 그 속성을 직렬화하기 위해 기본 JVM 직렬화 메커니즘을 사용하는 것으로 제한되지 않습니다.개발자는 컨테이너가 컨테이너가 readObject 및 writeObject Methods를 구현할 경우 세션 속성에서 전화 할 것이라고 보장하지 않습니다. 그러나 속성의 직렬화 가능한 폐쇄가 보존 될 것임을 보장합니다..

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top