2011-11-04 12 views
17

Por lo que sé, los Servlets Java están manejando múltiples solicitudes al mismo tiempo y he buscado a través de StackOverflow y de Google, y confirmé lo que pensaba. Sin embargo, estoy bastante confundido en este momento, escribí un servlets simple que parece mostrar un comportamiento de bloqueo.Servlet parece manejar múltiples solicitudes simultáneas del navegador sincrónicamente

por lo que tienen un servlet simple:

public class MyServlet extends HttpServlet 
{ 
    private static final long serialVersionUID = 2628320200587071622L; 

    private static final Logger logger = Logger.getLogger(MyServlet.class); 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
    { 
     logger.info("[doGet] Test before"); 

     try { 
      Thread.sleep(60000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     logger.info("[doGet] Test after"); 

    resp.setContentType("text/plain"); 
    resp.getWriter().write("OK"); 

    } 
} 

Entonces tengo 2 ventanas del navegador, que se abrió en el ~ mismo tiempo que afectó a mi servlet. Y el resultado es la primera solicitud que bloquea el 2do. El registro también muestra:

10:49:05,088 [http-8383-Processor14] INFO MyServlet - [doGet] Test before 
10:50:05,096 [http-8383-Processor14] INFO MyServlet - [doGet] Test after 
10:50:05,106 [http-8383-Processor22] INFO MyServlet - [doGet] Test before 
10:51:05,112 [http-8383-Processor22] INFO MyServlet - [doGet] Test after 

Siento que estoy perdiendo algo ... servlets supone que es capaz de manejar solicitudes simultáneas, pero tampoco parece estar haciéndolo. También hice lo mismo que el anterior en el método de servicio en lugar de doGet y hace lo mismo.

¿Alguna sugerencia?

Gracias

+1

Su navegador podría serializar las solicitudes, ¿qué ocurre si intenta esto desde 2 computadoras diferentes o con 2 navegadores diferentes? (es decir, iexploere y firefox) También puede verificar los registros de acceso http para ver si las solicitudes llegan a su contenedor de servlets al mismo tiempo. – rsp

+0

¿Puedes mostrar el 'web.xml' y (suponiendo que sea Tomcat) el' server.xml'. – beny23

+0

@beny: No estoy seguro de cómo eso sería útil para comprender la causa del problema. ¿Puedes elaborar? – BalusC

Respuesta

25

Su navegador aparentemente está utilizando la misma conexión HTTP en diferentes ventanas. El contenedor de servlets usa un único hilo por conexión HTTP, no por solicitud HTTP. Debes ejecutar dos webbrowsers físicamente diferentes para probar esto correctamente. P.ej. un Firefox y un Chrome.

+0

¿Qué te hace? ¿piensas que aquí se usa una conexión de un hilo por - **? Las dos solicitudes son procesadas por diferentes subprocesos, ¿no podría ser que el servidor adoptara una política de solicitud de una sola cadena por - **, mientras que en el lado del cliente la misma conexión TCP se utilizara sin interconexión de HTTP (tan en cola por el navegador)? Esto explicaría el procesamiento secuencial a pesar de los diferentes hilos involucrados. –

+0

@BalusC: en lugar de contaminar este hilo, consideré plantear un hilo separado para esto. Ver - http://stackoverflow.com/questions/37360731/how-does-a-servlet-container-synchronise-access-for-multiple-requests-to-a-parti –

Cuestiones relacionadas