2011-04-05 8 views
6

Por lo tanto, estoy en una situación en la que quiero poner en cola un grupo de objetos HttpServletRequest para el procesamiento asincrónico. Dejando de lado por el momento si esta es una estrategia sabia o no (en realidad es en este caso, ya que estoy tratando de actualizar un sistema heredado horrible) ¿es esto algo peligroso de hacer?¿Es peligroso almacenar objetos HttpServletRequest en una cola para su posterior procesamiento?

Lo que me preocupa aquí es si el objeto HttpServletRequest tiene o no recursos valiosos o conexiones abiertas que podrían llevar a bloqueos o problemas de contención de recursos.

Supongamos aquí que estoy implementando un servlet simple con un método doPost() que toma el objeto HttpServletRequest, lo coloca en una LinkedBlockingQueue y luego envía al usuario algún tipo de respuesta stock (como un 301 redirigir a una confirmación página).

Gracias!

+0

depende de su contenedor de servlet, pero es bastante probable que explote. ¿A qué información en la solicitud estarás accediendo? pon * eso * en tu LBQ. – Ron

+0

Estoy usando resina. Y sí, soy consciente de que puedo hacer eso, pero por varias razones que tienen que ver con el código heredado, eso no es tan sencillo como debería ser. – sangfroid

Respuesta

6

he visto las partes internas de embarcadero, y puedo asegurarle que mover esa estructura de la solicitud actual sería muy, muy malo. hay todo tipo de estado de conexión actual que no se puede usar fuera de la solicitud actual. No puedo evitar suponer que sería cierto para prácticamente cualquier contenedor de servlets.

Parece que está pensando en responder a la solicitud original y luego hacer un procesamiento adicional. Recomiendo copiar la información que necesita de la solicitud original en una estructura de datos separada para el procesamiento fuera de línea. Además, si está tratando con código que requiere una HttpServeletRequest, siempre puede simular los suyos propios con los bits de datos requeridos por el código.

+0

Básicamente, necesito tomar un proceso que actualmente es síncrono y hacerlo asíncrono. Todos los valores que necesito están en los encabezados HTTP, parámetros de formulario y cookies. El problema es que este conjunto de valores está mal definido y oculto en el código heredado. Podría tratar de "descubrir" cuáles son estos valores y luego refactorizar la lógica comercial para tomar una nueva estructura de datos en lugar de un objeto HttpServletRequest, pero sería un proceso tedioso y propenso a errores. Prefiero dejar el código heredado solo y seguir pasando un objeto HttpServletRequest. Burlarse es una opción, sin embargo. – sangfroid

1

me hicieron algo que es muy similar, y uno de los problemas que he experimentado es que embarcadero parece que limpiar cosas dentro de la HttpServletRequest en algún momento, dejándole con null valores de retorno de algunos de los métodos getXYZ y NPE incluso lanzando en por los demás

Entonces, sí, es peligroso.

Ahora copio las cosas que necesito dentro de doPost y doGet y olvido la instancia por completo.

Cuestiones relacionadas