2012-01-30 16 views
6

El siguiente programa:¿Cuándo se destruye la instancia creada por el servidor?

public class SimpleCounter extends HttpServlet { 

    int counter=0; 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     response.setContentType("text/plain"); 
     PrintWriter writer = response.getWriter(); 
     counter++; 
     writer.println("accessed " + counter + " times"); 
    } 
} 

imprime el valor incrementado del contador cada vez que accedan a la URL de este servlet. Leí que el servidor crea una instancia de este servlet y cada vez que hay una solicitud para este servlet, un nuevo hilo asigna esta solicitud a la instancia especial creada por el servidor.

¿Cuándo la instancia creada por el servidor (a la que se asigna el hilo de la solicitud) muere? ¿Cuándo mueren los hilos creados por una nueva solicitud?

+1

¿Esto se relaciona con un contenedor específico? Algunos, como Google App Engine, reclaman agresivamente aplicaciones que no han recibido solicitudes durante un período de tiempo. –

+0

@ Mike Samuel en realidad no. Pero podría incluirse en la respuesta/discusión –

+0

Relacionado: http://stackoverflow.com/questions/3106452/how-do-servlets-work-instantiation-session-variables-and-multithreading – BalusC

Respuesta

4

La instancia de servlet se crea cuando se inicia su aplicación web, o cuando se requiere por primera vez (si se establece lazy-init). Se elimina cuando su aplicación web se detiene, cuando se convierte en GC. En un entorno de producción normal, me atrevería a afirmar que esto nunca sucede realmente (sin contar el despliegue de una nueva versión).

La mayoría (si no todos) los contenedores de servlets funcionan con un grupo de subprocesos. Esto significa que reutilizan los hilos para manejar las solicitudes. Entonces estos hilos nunca mueren; vuelven al grupo cuando terminan de ejecutar la solicitud.

Por supuesto, ellos no mueren cuando se apaga el servidor :)

Desde el punto de vista de su aplicación, que realmente debe tratar de hacer nuestro servlet sin estado, y se puede considerar la seguridad de que cada solicitud se ejecuta en su propio hilo dedicado.

+0

_ "realmente deberías tratar de hacer su servlet sin estado "_ ¿puede explicar esto? –

+0

Lo que significa que no debe mantener ningún estado de aplicación allí. De esta forma, no tiene que preocuparse por cuándo se crea o se destruye. Idealmente, ni siquiera debería importar cuántos se crean instancias (lo cual es útil en un entorno agrupado). –

+0

@SuhailGupta, en palabras simples, no use variables estáticas en Servlets. – kosa

Cuestiones relacionadas