¿Qué significa el valor del servlet <load-on-startup>

174

Me estoy confundiendo un poco aquí. En nuestra aplicación estamos definiendo algunos servlets. Aquí está el extracto de web.xmluno 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 tengo entendido, el valor para el <load-on-startup>tiene que ser un número entero positivo para que se cargue automáticamente. Busqué en google pero las respuestas que encontré solo aumentaron mi confusión.

Vini
fuente

Respuestas:

186

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 cargar 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-startupindica 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 entero negativo, o el elemento no está presente, el contenedor es libre de cargar el servlet siempre que 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 inferiores se carguen antes que los servlets marcados con enteros superiores. El contenedor puede elegir el orden de carga de los servlets con el mismo load-on-startupvalor.

Probablemente desee comprobar no solo el JSR, sino también la documentación de su contenedor web. Puede haber diferencias

Eddie
fuente
Cletus está equivocado en su respuesta. Debes considerar editar la publicación.
Alboz
3
¿Qué sucede cuando no se especifica la carga al inicio?
Nirmal
1
@Nirmal El segundo párrafo especifica que si el elemento no está presente tiene el mismo comportamiento que si fuera negativo, es decir, el contenedor es libre de cargar el servlet cuando lo desee.
Finnegan
129

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) al inicio de la aplicación web. El contenido opcional de estos elementos debe ser un número entero que indique el orden en que se debe cargar el servlet. Si el valor es un entero negativo o el elemento no está presente, el contenedor puede cargar el servlet siempre que 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 implementa la aplicación. El contenedor debe garantizar que los servlets marcados con enteros más bajos se carguen antes que 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 inicio.

Nishant
fuente
1
Y es por eso que marcamos 0 para que DispatcherServlet se cargue primero cuando se inicia la aplicación ..
Lucky
11

Indica que el servlet no se iniciará hasta que una solicitud intente acceder a él.

Si load-on-startup es mayor o igual a cero, entonces cuando el contenedor se inicie, iniciará ese servlet en orden ascendente de la carga en el valor de inicio que haya puesto allí (es decir, 0, 1 luego 2, luego 5, luego 10, etc.) .

cletus
fuente
77
Cero también causa carga. Solo los valores negativos no están garantizados: "[...] 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." [...]
marabol
1
@cletus Creo que es mejor modificar mayor que cero con mayor o igual a cero , porque muchos usuarios leen su respuesta según lo indicado por el aceptado. Gracias de antemano
Tarik
9

Ciclo de vida del servlet

El ciclo de vida de un servlet está controlado por el contenedor en el que se ha desplegado el servlet. Cuando una solicitud se asigna a un servlet, el contenedor realiza los siguientes pasos.

  1. Si no existe una instancia del servlet, el contenedor web:

    a. Carga la clase de servlet

    si. Crea una instancia de la clase servlet

    C. Inicializa la instancia de servlet llamando al método init (la inicialización se trata en Crear e inicializar un servlet )

  2. El contenedor invoca el método de servicio, pasando objetos de solicitud y respuesta. Los métodos de servicio se discuten en Escritura de métodos de servicio .

Un valor 0 en load-on-startupsignifica que el punto 1 se ejecuta cuando una solicitud llega a ese servlet. Otros valores significan que el punto 1 se ejecuta al inicio del contenedor.

rebeldes
fuente
respuesta impecable!
Gaurav
1

Como se indicó en otra respuesta y este artículo cero de carga al inicio es aceptable y, en ausencia de cualquier otro servlet, esto tendrá prioridad en la carga y carga durante la implementación. El mejor uso de statup de carga es cargar los servlets, lo que lleva más tiempo inicializar mucho antes de que la primera solicitud llegue como servlets que crea un grupo de conexiones o realiza llamadas de red o retiene recursos voluminosos, esto reducirá significativamente el tiempo de respuesta para las primeras solicitudes.

Suresh Pradhan
fuente
1
  1. 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.
  2. si es 0 o entero negativo que Servlet se cargará cuando el Contenedor sienta que debe cargarlos.
  3. garantiza la carga, la inicialización y el método de llamada a init () del servlet por contenedor web.
  4. Si no hay ningún elemento para ningún servlet, se cargarán cuando el contenedor web decida cargarlos.
Rohit
fuente
0

sí, puede tener el mismo valor ... la razón para dar números a la carga al inicio es definir una secuencia para que el servidor cargue todo el servlet. el servlet con valor 0 de carga al inicio se cargará primero y el servlet con valor 1 se cargará después de eso.

si dos servlets tendrán el mismo valor para cargar en el inicio que se cargarán cómo se declaran en el web.xml de arriba a abajo. el servlet que viene primero en web.xml se cargará primero y el otro se cargará después de eso.

Bharat Patel
fuente
0

-> Etiqueta (Ausencia de carga al inicio) En primer lugar, cuando se despliega un servlet en el servidor, es responsabilidad del servidor crear el objeto servlet. Por ejemplo: supongamos que Servlet se implementa en el servidor, (el objeto Servlet no está disponible en el servidor) el cliente envía la solicitud al servlet por primera vez y luego el servidor crea el objeto servlet con la ayuda del constructor predeterminado e inmediatamente llama a init (). A partir de ese momento, cuando el cliente envíe la solicitud, solo se ejecutará el método de servicio ya que el objeto ya está disponible

Si se utiliza la etiqueta de carga al inicio en el descriptor de implementación: 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 seguirá de 0-128 0 servlet número será creado primero y seguido de 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 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 el servlet.

Si no usamos la etiqueta de carga al inicio 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 se ha modificado un .class 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 utilizará el 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 de destrucción en el servlet existente y crea un nuevo objeto de servlet y llama a init () para su inicialización .

anil paritala
fuente
-1

Si el valor es <0, el serlet se instancia cuando llega la solicitud, de lo contrario> = 0 el contenedor se cargará en el orden creciente de los valores. si 2 o más servlets tienen el mismo valor, el orden de los servlets declarado en web.xml.

Nalini
fuente
-2

El contenedor de servlets carga el servlet durante el inicio o cuando se realiza la primera solicitud. La carga del servlet depende del atributo "load-on-startup" en el archivo "web.xml". Si el atributo tiene un número entero positivo (0 a 128), 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 llama "Carga diferida".

Preetesh Kumar Chaudhary
fuente
-6

Es simple como ni siquiera lo espera.

Si el valor es positivo, se carga cuando se inicia el contenedor

Si el valor no es positivo, el servidor se carga cuando se realiza la solicitud.

Preguntas de Java
fuente