Pregunta

En mi entendimiento de Servlet, Servlet creará una instancia del Servlet, su método init () se llamará una vez, y el servlet vivirá como un singleton hasta que se apague la JVM.

No espero que mi servlet sea serializado, ya que se construirá nuevo cuando el servidor de aplicaciones se recupere o se inicie normalmente. El servlet no debe contener miembros específicos de la sesión, por lo que no tiene sentido que se escriba en el disco y se vuelva a crear una instancia. ¿Hay algún uso práctico para esto?

Lo que me preocupa es que puse algunos campos no serializables dentro y luego mi aplicación fallará misteriosamente en un entorno de producción donde se llevará a cabo un tipo diferente de replicación de sesión.

¿Fue útil?

Solución

Técnicamente, creo que el contenedor de servlets está autorizado para " pasivar " El objeto servlet al disco, de manera similar a como pueden ser los beans de sesión EJB. Por lo tanto, es correcto hacer la pregunta si su aplicación fallará debido a campos no serializables.

En la práctica, nunca he oído hablar de un contenedor que haga esto, por lo que es solo un equipaje heredado de los viejos tiempos de J2EE. No me preocuparía por eso.

Otros consejos

HttpServlet debe ser serializado en el disco y sobrevivir al reinicio del contenedor de servlets. Por ejemplo, Tomcat te permite configurar un indicador que permite este tipo de supervivencia. La siguiente opción es transferir usando JNDI. Esto no es basura, se usa solo en casos de uso extremo.

Google parece sugerir que esto se hizo para que los autores de los contenedores puedan tener la opción, si lo desean.

Tienes razón en que el servlet no debe contener miembros específicos de la sesión, de hecho, creo que querrías el menor estado posible. Si almacena todo en Session o ServletConfig, creo que podrá sobrevivir a la serialización.

¿Al igual que los objetos Session se serializan para sobrevivir a los cachés de los servletcontainers que dan la opción de clúster, podría haber una opción para que un contenedor transfiera una instancia de Servlet también a otro nodo del clúster? Estoy adivinando aquí

Serializable se utiliza como interfaz de marcador para los atributos de la sesión en un entorno distribuido.

  

SRV.7.7.2 Entornos distribuidos (JSR-154)

     

Dentro de una aplicación marcada como distribuible , todas las solicitudes que   son parte de una sesión que debe ser manejada por una máquina virtual Java   ("JVM") a la vez. El contenedor debe ser capaz de manejar todos los objetos.   colocado en las instancias de la clase HttpSession utilizando el atributo setAttribute   o poner los métodos de valorar adecuadamente. Las siguientes restricciones son   impuesto para cumplir con estas condiciones:

     
      
  • El contenedor debe aceptar objetos que implementen la interfaz Serializable .
  •   
  • La migración de las sesiones se realizará mediante instalaciones específicas del contenedor.
  •   
     

El contenedor de servlet distribuido debe lanzar un   IllegalArgumentException para objetos donde el contenedor no puede   Apoyar el mecanismo necesario para la migración de la sesión de almacenamiento.   ellos .

     

El contenedor de servlets distribuido debe soportar el mecanismo necesario   para    migrar objetos que implementan Serializable .

     

(...)

     

El proveedor de contenedores puede garantizar la escalabilidad y la calidad del servicio   características como el equilibrio de carga y la conmutación por error mediante que tiene la capacidad de   mueva un objeto de sesión, y su contenido, desde cualquier nodo activo del   Sistema distribuido a un nodo diferente del sistema. Si se distribuye   los contenedores persisten o migran sesiones para proporcionar calidad de   características del servicio, no están restringidas a usar la JVM nativa   Mecanismo de serialización para serializar HttpSessions y sus   atributos Los desarrolladores no tienen garantizado que los contenedores llamarán   Los métodos readObject y writeObject en atributos de sesión si   implementarlos, pero se garantiza que el cierre Serializable de   sus atributos se conservarán .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top