2011-03-11 20 views
5

Deseo implementar la siguiente lógica: cuando recibo HttpServletRequeset y HttpServletResponse en el método doService del servlet principal (en el hilo del contenedor web principal), comienzo A, B, C tres hilos (hilo administrado por mi propio programa) para procesar otro servlet en modo paralelo, y luego unir cada respuesta de estos servlets en el hilo principal, y si uno de mi propio hilo (asumir el hilo A) funciona lentamente, el hilo principal terminará, por lo que la respuesta principal volverá al usuario.y el Un hilo debe continuar funcionando correctamente, solicitaré la respuesta del hilo A usando AJAX en el navegador más adelante.¿Cómo clonar HttpServletRequest y HttpServletResponse separados proporcionados por Servlet Container?

lo tanto, quiero clonar el HttpServlettRequest y HttpServletResponse proporcionado por el contenedor servlet, y la petición y la respuesta clonado deberá estar cortado (Cuando el recipiente de HttpServletTrequest y HttpServletResponse terminado, la solicitud clonado y Reponse todavía funcionan correctamente).

El comportamiento de la solicitud y respuesta clonadas debe ser el mismo que el del Contenedor desde la vista de mi código. Se puede seguir e incluir.

¿Alguna idea?

Muchas gracias!

L.J.W

+1

No puedes. Período. ¿Cuál es el requisito funcional? Entonces podemos proporcionar respuestas/sugerencias más adecuadas para lograr el requisito funcional. – BalusC

Respuesta

3

Suena como que necesita para crear clases para actuar como delegado a los objetos HttpRequest y HttpResponse y luego pasar una referencia a un objeto a Ejecutable al proceso.

Hay ciertas operaciones que solo se pueden hacer una vez en un objeto HttpRequest (leyendo de los resortes de la corriente de entrada), la clase de delegado debería tener esto en cuenta.

No estoy seguro de lo que va a hacer si los subprocesos A, B y C hacen cambios conflictivos al objeto HttpResponse.

creo que preferiría no pasar el objeto HttpResponse a través de los hilos de procesamiento y salir de la lógica para poblar la respuesta de la clase servlet controlador

+0

Deseo que la Solicitud clonada y la respuesta se puedan separar, por lo que no puedo pasar la referencia (etc., no puedo usar el método de ajuste) –

+1

@LJW: lo que dices no tiene ningún sentido. "No puedo pasar la referencia", entonces no debe usar Java ... –

+1

@ L.J.W Puede querer, pero no _get_, ya que usar la respuesta cuando se envía una respuesta es un comportamiento indefinido. En otras palabras, se bloqueará porque las transmisiones (probablemente) se han cerrado. – extraneon

2

Creo que se está solicitando que gran parte de la HttpServletRequest. Una vez que se ha completado una solicitud, no debe contar con que el objeto de solicitud sea de alguna utilidad. No recomiendo enrutar dentro de un contenedor J2EE en la mayoría de los casos, pero ese es un problema diferente.

Si debe manejar la petición en paralelo recomiendo a extraer los datos necesarios del objeto de petición y enviar eso a sus hilos y hacer los subprocesos de trabajo sobre todo Servlet ignorantes con la excepción de la HttpSession donde podían almacenar sus valores calculados para la recuperación de Ajax.

+0

El hilo debe procesar servletrequet y response, no puedo enviar otro tipo de datos .. –

+0

@ L.J.W En otras palabras, necesitaría implementar una HttpRequest y HttpResponse personalizadas e inicializarla con datos copiados de la solicitud y respuesta especificadas. No copie las transmisiones porque eso no funcionará. – extraneon

3

Las clases de solicitud y respuesta no están diseñadas para ser clonadas o acceder desde múltiples subprocesos. Si intentas hacerlo, es probable que tengas problemas. Sugiero que reconsidere sus requisitos.

5

Clonación La solicitud y respuesta HTTP es posible a través de la clase HttpServletResponseWrapper http://docs.oracle.com/javaee/1.3/api/javax/servlet/http/HttpServletResponseWrapper.html. Puede encontrar un ejemplo de uso en la documentación de Sun https://web.archive.org/web/20120626033905/http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Servlets8.html.

Observe que esto fue una solución de (en ese momento) Sun para solucionar este problema, ya que nunca se planeó que pudiera modificar la información de solicitud y respuesta antes de confirmarla.

Puede usar el contenedor para hacer una copia de la información de Http y pasarla a un hilo diferente.

Cuestiones relacionadas