2010-09-28 14 views
14

¿Cuál es la diversa entre la función asíncrona servlet 3.0 en contra:Servlet 3.0 asíncrono

old servlet impl 
doGet(request,response) { 
Thread t = new Thread(new Runnable() 
    void run(){ 
     // heavy processing 
     response.write(result) 
    } 
} 
t.start(); 

En servlet 3.0 si pierdo un hilo que hacer pesada de procesamiento - que gano un hilo más en el contenedor, pero yo lo desperdicien en procesamiento pesado ... :(

Alguien puede ayudar?

+7

Si alguna de las siguientes respuestas es lo que estaba buscando, ¿podría usted? marcarlo como tal? –

Respuesta

2

el servlet 3.0 función asíncrona proporciona para mantener la conexión http abierta pero que libere a todos los hilos no utilizados cuando la solicitud no puede ser servido inmediatamente, pero está a la espera de algún acontecimiento ocurrir o por ejemplo cuando yo Estás escribiendo una aplicación comet/reverse ajax. En el caso anterior, estás creando un nuevo hilo por completo, por lo que no debería haber ninguna diferencia para ti a menos que quieras mantener la solicitud a la espera de algún evento.

Best Regards, Keshav

23

Esto no va a funcionar. Una vez que finaliza su método doGet, la respuesta se completa y se envía de vuelta al cliente. Su hilo puede o no seguir ejecutándose, pero no puede cambiar la respuesta por más tiempo.

Lo que hace la nueva característica asíncrona en Servlet 3.0 es que le permite liberar el hilo de solicitud para procesar otra solicitud. Lo que ocurre es lo siguiente:

RequestThread: |-- doGet() { startAsync() } // Thread free to do something else 
WorkerThread:     |-- do heavy processing --| 
OtherThread:           |-- send response --| 

Lo importante es que una vez que ha comenzado RequestThread procesamiento asíncrono a través de una llamada a startAsync(...), es libre de hacer otra cosa. Puede aceptar nuevas solicitudes, por ejemplo. Esto mejora el rendimiento.

+0

Según mi comprensión, 'RequestThread' no será 'libre' para hacer otra cosa inmediatamente después de llamar a' startAsync (...) ', será libre solo cuando' RequestThread' haya completado su trabajo, por ejemplo, si 'startAsync (...)' se llama dentro de 'doGet()' 'RequestThread' será libre una vez que se ejecute' doGet() '. – user454322

+0

Para ser precisos, el hilo que maneja el 'doGet()', estará disponible una vez que toda la pila de métodos haya finalizado (el método que llama al método ... que llama al método que llama a 'doGet() '). –

+0

Sí, eso es lo que quise decir – user454322

2

Hay varias API-s que admiten COMET (solicitudes HTTP de larga vida, donde no hay problemas de subprocesos/solicitudes). Por lo tanto, no hay una necesidad estricta de usar la API de servlet 3 para evitar el hilo/solicitud. Uno es el motor Grizzly que se ejecuta en Glassfish 2.11 (example). La segunda solución es Jetty Continuation. El tercero es Servlet 3 API..

El concepto básico es que la solicitud crea algún controlador asíncrono administrado por contenedor en el que la solicitud puede suscribirse a un evento identificado por un objeto (por ejemplo, una cadena clientid). Entonces, el subproceso de procesamiento asíncrono una vez puede decirle al controlador que el evento se produce y la solicitud obtiene un hilo para continuar. Depende totalmente del servidor de aplicaciones elegido que la API pueda usar. ¿Cuál es tu elección?

+0

Se debe tener en cuenta que Grizzly y Jetty logran esto mediante sus propias soluciones, mientras que el estándar Servlet 3.0 significa que tales soluciones no portátiles (en diferentes servidores de aplicaciones) ya no serán necesarias.Naturalmente, Grizzly y Jetty (o van a) implementar Servlet 3.0, uno se imaginaría. Por lo tanto, no se trata de elegir entre los tres, sino elegir cuál de los dos, cuál implementar el tercero, te gusta. – user359996

2

La creación de sus propios subprocesos en un contenedor servlet es un problema. (Puede haber casos en los que tenga que hacerlo, pero si tiene algún marco que administre los hilos, entonces debe usarlo).

Cuestiones relacionadas