for examples example beginners java java-ee servlets destroy

java - examples - Llamando al método de destrucción del servlet.



jsp example (8)

De la especificación ( The Servlet Interface -> Servlet Life Cycle -> End of Service ):

Una vez que se llama al método de destrucción en una instancia de servlet, el contenedor no puede enrutar otras solicitudes a esa instancia del servlet. Si el contenedor necesita habilitar el servlet nuevamente, debe hacerlo con una nueva instancia de la clase del servlet.

La especificación se refiere a una instancia particular del servlet que se está destruyendo.

Entonces, ¿eso significa que destruirán se llamará y ya no se utilizarán?

No significa que el servlet cuya instancia se destruye nunca se use. Es solo esa instancia en particular que no se usa, ya que se habría recolectado como basura. Cuando llega una solicitud para ese servlet, el contenedor creará una nueva instancia de ese servlet y realizará todas las acciones del ciclo de vida hasta que se sirva la solicitud, nuevamente.

Según el enlace http://www.xyzws.com/Servletfaq/when-is-destroy-of-servlets-called/20 , una de las razones de llamar al método de destrucción es cuando el servlet no tiene una solicitud en un mucho tiempo

Estaba pensando que podría haber algunas páginas que no sean llamadas por mucho tiempo. Entonces, ¿eso significa que destruirán se llamará y ya no se utilizarán?

En realidad, me hicieron esta pregunta en una entrevista y él me dijo que solo se llamará al método de destrucción cuando el servidor se apaga.

Aprecio cualquier ayuda en esto.


De la especificación de Servlet: -

El contenedor de servlet llama al método destroy () para indicar a un servlet que el servlet está fuera de servicio. Este método solo se llama una vez que todos los subprocesos dentro del método de servicio del servlet hayan salido o después de que haya transcurrido un período de tiempo de espera. Después de que el contenedor servlet llama al método destroy (), no volverá a llamar al método de servicio en "ESTE SERVLET".

No se requiere que el contenedor de servlets mantenga un servlet cargado por un período de tiempo en particular. Una instancia de servlet se puede mantener activa en un contenedor de servlet durante un período de milisegundos, durante la vida útil del contenedor de servlet (que podría ser una cantidad de días, meses o años), o cualquier período de tiempo intermedio.

Cuando el contenedor de servlets determina que un servlet debe eliminarse del servicio, llama al método de destrucción de la interfaz de Servlet para permitir que el servlet libere cualquier recurso que esté utilizando y guarde cualquier estado persistente. Por ejemplo, el contenedor puede hacer esto cuando quiere conservar los recursos de memoria, o cuando se está cerrando.

Antes de que el contenedor de servlets llame al método de destrucción, debe permitir que cualquier subproceso que se esté ejecutando actualmente en el método de servicio del servlet para completar la ejecución, o exceder un límite de tiempo definido por el servidor.

Una vez que se llama al método de destrucción en una instancia de servlet, el contenedor no puede enrutar otras solicitudes a esa instancia del servlet.

Si el contenedor necesita habilitar el servlet nuevamente, debe hacerlo con una nueva instancia de la clase del servlet.


Depende totalmente de la implementación del contenedor de servlets que está utilizando. Si su contenedor de servlets es muy conservador para ahorrar recursos, puede destruir el servlet que no está en servicio por mucho tiempo.

En la página 22 de la especificación 2.5 del servlet, encontrará que, "Cuando el contenedor del servlet determina que un servlet debe eliminarse del servicio, llama al método de destrucción de la interfaz del servlet para permitir que el servlet libere cualquier recurso que esté utilizando y guarde. cualquier estado persistente. Por ejemplo, el contenedor puede hacer esto cuando quiere conservar los recursos de memoria, o cuando se está cerrando ".


El javadoc de Servlet.destroy() dice: "Llamado por el contenedor de servlets para indicar a un servlet que el servlet está fuera de servicio". No especifica qué situaciones harían que un servlet se "fuera de servicio", es simplemente un evento al que puede reaccionar si lo necesita. Por ejemplo, es posible que desee cerrar algunos recursos que haya abierto o conservar un estado en el almacenamiento.

La razón más obvia para esto es que el contenedor de servlets se está cerrando, pero un contenedor podría igualmente decidir que es hora de descargar un servlet porque no se ha utilizado en un mes y simplemente consume recursos. Ese comportamiento depende completamente de la implementación, y no es algo que deba preocuparte (como diseñador de servlets).


El método de destrucción de Servlet es una devolución de llamada. Estas son las funciones llamadas por el contenedor cuando un evento en particular está a punto de ocurrir (en este caso, el servlet está a punto de ser destruido). Por lo tanto, todo el propósito es que si desea hacer algo (por ejemplo: limpiar el recurso) puede hacerlo bajo esta devolución de llamada.


Esta es una de esas cosas clásicas de especificación vs implementación. La especificación permite que los contenedores Servlet como Tomcat mantengan un conjunto de objetos Servlet, creando y destruyendo a medida que la carga sube o baja. En este tipo de configuración, se llamará a destroy cuando la instancia en particular ya no sea necesaria. Incluso sería legal crear una nueva instancia para cada solicitud, llamando a init inmediatamente antes de que la solicitud se procese y destruya inmediatamente después.

Sin embargo, en la práctica, prácticamente todos los contenedores de Servlet mantienen exactamente una instancia de cada Servlet. Dado que se requiere que los Servlets sean seguros para subprocesos, esto también es perfectamente correcto. En este escenario, solo se llama a destroy cuando el contexto está apagado.

No puedo pensar en muchos casos en los que desee agrupar los Servlets, pero la especificación lo permite.


HASTA DONDE SE,

En el servlet de java, destroy() no debe ser llamado por el programador. Pero, si se invoca, se ejecuta. La pregunta implícita es, ¿se destruirá el servlet? No, no lo hará. destroy() método destroy() no debe y no destruirá un servlet de java.

El significado de destroy() en el servlet java es que el contenido se ejecuta justo antes de que el contenedor decida destruir el servlet. Pero si invoca usted mismo el método destroy() , el contenido simplemente se ejecuta y luego el proceso respectivo continúa. Con respecto a esta pregunta, el destroy() se ejecuta y luego se completa la inicialización del servlet.

destroy() método destroy() se invoca primero, luego se quita el Servlet del contenedor y luego se recolecta la basura. destroy() método destroy() generalmente contiene código para liberar cualquier recurso como la conexión JDBC que no se recolectará en la basura.


Par de casos:

  1. cuando el contenedor se apaga o la aplicación se apaga;
  2. cuando el contenedor decide que hay escasez de memoria;
  3. Cuando este servlet no tiene una solicitud en mucho tiempo.

Según el Doc

Llamado por el contenedor de servlets para indicar a un servlet que el servlet está fuera de servicio. Este método solo se llama una vez que todos los subprocesos dentro del método de servicio del servlet hayan salido o después de que haya transcurrido un período de tiempo de espera. Después de que el contenedor de servlets llame a este método, no volverá a llamar al método de servicio en este servlet.