java ee - startups - ¿Qué significa el valor de servlet<load-on-startup>?
startup digital (11)
- Si el valor es el mismo para dos servlets, se cargarán en un orden en el que se declaran dentro del archivo web.xml.
- si es 0 o un entero negativo, se cargará el servlet cuando el contenedor sienta que los carga.
- garantiza la carga, inicialización y llamada al método init () de servlet por contenedor web.
- Si no hay ningún elemento para ningún servlet, se cargarán cuando el contenedor web decida cargarlos.
Me estoy confundiendo un poco aquí. En nuestra aplicación, tenemos algunos servlets definidos. Aquí está el extracto del web.xml
para uno de los servlets:
<servlet>
<servlet-name>AxisServlet</servlet-name>
<display-name>Apache-Axis Servlet</display-name>
<servlet-class>com.foo.framework.axis2.http.FrameworkServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
Según mi entendimiento, el valor de <load-on-startup>
tiene que ser un entero positivo para que se cargue automáticamente. Miré hacia arriba en google pero las respuestas que encontré solo aumentaron mi confusión.
-> (Ausencia de carga en el arranque) etiqueta En primer lugar, cuando el servlet se implementa en el servidor, es responsabilidad del servidor crear el objeto servlet. Ejemplo: supongamos que Servlet se implementa en el servidor, (el objeto de servlet no está disponible en el servidor) el cliente envía la solicitud al servlet por primera vez, luego el servidor crea el objeto servlet con la ayuda del constructor predeterminado e inmediatamente llama a init (). A partir de eso, cuando el cliente envíe la solicitud, solo se ejecutará el método de servicio ya que el objeto ya está disponible
Si se usa la etiqueta load-on-start-up en el descriptor de despliegue: en el momento de la implementación, el servidor crea el objeto servlet para los servlets en función del valor positivo proporcionado entre las etiquetas. La creación de objetos para las clases de servlet se realizará a partir de 0-128 0 Se creará primero el servlet numérico y luego otros números.
Si proporcionamos el mismo valor para dos servlets en web.xml, la creación de objetos se realizará en función de la posición de las clases en web.xml y también varía de un servidor a otro.
Si proporcionamos un valor negativo entre la carga en la etiqueta de inicio, el servidor no creará el objeto servlet.
Otros escenarios donde el servidor crea el objeto para servlet.
Si no usamos load on start up tag en web.xml, el proyecto se implementa cuando el cliente envía la solicitud por primera vez; el servidor crea el objeto y el servidor es responsable de llamar a sus métodos de ciclo de vida. Entonces si una .class se ha modificado en el servidor (tomcat). de nuevo, el cliente envía la solicitud de servlet modificado, pero en el caso de tomcat no se creará un nuevo objeto y el servidor hará uso del objeto existente a menos que se reinicie el servidor. Pero en la clase de lógica web cuando el archivo .class se modifica en el servidor sin reiniciar el servidor si recibe una solicitud, el servidor llama al método destroy en el servlet existente y crea un nuevo objeto servlet y llama a init () para su inicialización .
Como se indica en otra respuesta y este artículo de carga al inicio, el cero es aceptable y, en ausencia de cualquier otro servlet, esto tendrá prioridad en la carga y se cargará durante la implementación. El mejor uso del statup load-on es cargar servlets, lo que demora más tiempo en inicializarse antes de que la primera solicitud llegue como servlets, que crea un pool de conexiones o hace una llamada de red o retiene recursos voluminosos, esto reducirá significativamente el tiempo de respuesta para las primeras solicitudes.
El contenedor de servlets carga el servlet durante el inicio o cuando se realiza la primera solicitud. La carga del servlet depende del atributo "carga al inicio" en el archivo "web.xml". Si el atributo tiene un entero positivo (0 a 128), entonces el servlet se carga con la carga del contenedor; de lo contrario, se carga cuando llega la primera solicitud de servicio.
Cuando el servlet se carga una vez que recibe la solicitud, se denomina "Carga diferida".
Nota: 0 también es un entero positivo.
Es simple, ni siquiera esperas.
Si el valor es positivo, se carga cuando comienza el contenedor
Si el valor no es positivo, el servelet se carga cuando se realiza la solicitud.
Indica que el servlet no se iniciará hasta que una solicitud intente acceder a él.
Si la carga al inicio es mayor o igual a cero, cuando el contenedor se inicie, comenzará ese servlet en orden ascendente de la carga en el valor de inicio que coloque allí (es decir, 0, 1, luego 2, luego 5, y así sucesivamente) .
Si el valor es <0, el serlet se crea una instancia cuando llega la solicitud, else> = 0 el contenedor se cargará en el orden creciente de los valores. si 2 o más servlets tienen el mismo valor, entonces el orden de los servlets declarado en el web.xml.
sí, puede tener el mismo valor ... la razón para asignar números a la carga al inicio es definir una secuencia para que el servidor cargue todo el servlet. el servlet con 0 valor de carga al inicio se cargará primero y el servlet con el valor 1 se cargará después de eso.
si dos servlets tendrán el mismo valor para load-on-startup de lo que se cargará la forma en que se declaran en el web.xml de arriba a abajo. el servlet que viene primero en el web.xml se cargará primero y el otro se cargará después de eso.
Resin 3.0 documenta este comportamiento:
load-on-startup puede especificar un valor entero (opcional). Si el valor es 0 o mayor, indica un orden para que se carguen los servlets, los servlets con números más altos se cargan después de los servlets con números más bajos.
La especificación JSP 3.1 (JSR 340) dice esto en la página 14-160:
El elemento
load-on-startup
indica que este servlet debe cargarse (instanciarse y tener su init () llamado) en el inicio de la aplicación web. El contenido del elemento de este elemento debe ser un número entero que indique el orden en que se debe cargar el servlet. Si el valor es un número entero negativo, o el elemento no está presente, el contenedor puede cargar el servlet cuando lo desee. Si el valor es un entero positivo o 0, el contenedor debe cargar e inicializar el servlet a medida que se despliega la aplicación. El contenedor debe garantizar que los servlets marcados con enteros más bajos se carguen antes de los servlets marcados con enteros más altos. El contenedor puede elegir el orden de carga de los servlets con el mismo valor deload-on-startup
.
Probablemente desee comprobar no solo el JSR, sino también la documentación de su contenedor web. Puede haber diferencias
El ciclo de vida de un servlet está controlado por el contenedor en el que se ha implementado el servlet. Cuando una solicitud se asigna a un servlet, el contenedor realiza los siguientes pasos.
Si no existe una instancia del servlet, el contenedor web:
a. Carga la clase servlet
segundo. Crea una instancia de la clase servlet
do. Inicializa la instancia de servlet llamando al método init (la inicialización se cubre en Crear e inicializar un servlet )
El contenedor invoca el método de servicio, pasando los objetos de solicitud y respuesta. Los métodos de servicio se discuten en los métodos de escritura del servicio .
Un valor 0 en load-on-startup
significa que el punto 1 se ejecuta cuando llega una solicitud a ese servlet. Otros valores significa que el punto 1 se ejecuta en el inicio del contenedor.
Respuesta corta : valor> = 0 significa que el servlet se carga cuando se implementa la aplicación web o cuando se inicia el servidor. valor <0: el servlet se carga cada vez que se siente el contenedor.
Respuesta larga (de la especificación):
El elemento load-on-startup indica que este servlet debe cargarse (instanciarse y tener su init () llamado) en el inicio de la aplicación web. Los contenidos opcionales de estos elementos deben ser un número entero que indique el orden en que se debe cargar el servlet. Si el valor es un número entero negativo, o el elemento no está presente, el contenedor puede cargar el servlet cuando lo desee. Si el valor es un entero positivo de 128 o 0, el contenedor debe cargar e inicializar el servlet a medida que se despliega la aplicación. El contenedor debe garantizar que los servlets marcados con enteros más bajos se carguen antes de los servlets marcados con enteros más altos. El contenedor puede elegir el orden de carga de los servlets con el mismo valor de carga al arrancar.