2009-11-13 10 views
5

Estoy usando Quartz para programar tareas en segundo plano para una aplicación web. Algunas de estas tareas simplemente disparan solicitudes contra la misma aplicación web.Incendio de ServletRequest interno en Tomcat

Quiero evitar depender de cualquier tipo de configuración de red (por ejemplo, una solicitud con mi propio nombre de dominio podría no enrutarse correctamente si se realiza desde el centro de datos). ¿Hay una API de Java para activar ServletRequest y que Tomcat maneje internamente (sin ningún HTTP real)?

Todavía quiero envolver el trabajo en una solicitud de servlet en lugar de llamar directamente al código de Java para las tareas en segundo plano, de modo que pueda volver a la solicitud HTTP habitual como una opción de configuración.

El código específico de Tomcat es aceptable.

Respuesta

0

Noción interesante. Ciertamente, no hay una API estándar para esto, y tampoco creo que exista un mecanismo específico de Tomcat.

¿Qué recibiría la solicitud? Un servlet? JSP? Controlador de primavera? Dependiendo de eso, y dependiendo de lo que haga el objetivo, es posible que pueda invocar el objetivo directamente, en lugar de enrutarlo a través del contenedor. Pero si tiene JSP, una pila de filtros y otras complejidades de servlet, es probable que esto no ocurra. no es una opción

Si por casualidad está utilizando Spring, entonces su trabajo de Quartz solo podría conectarse directamente con el controlador y sería tan fácil como desee. ¿Eres tan afortunado?

+1

Quiero ir a través de una URL (en lugar de llamar a los controladores directamente) para que pueda volver a HTTP más tarde. Mantiene las cosas desacopladas – Thilo

+0

API estándar: si estuviera dentro de un servlet, supongo que podría hacer requestDispatcher.include (fakedRequest, fakedResponse). Pero no lo soy. – Thilo

1

¿Qué desea obtener de las tareas programadas? El comportamiento estándar del servidor web es obtener una solicitud HTTP y responder con datos particulares. Supongo que sus tareas no lo necesitan, es decir, que desea simplemente realizar un procesamiento particular, cuya base de código reside dentro de la aplicación web.

Si la suposición anterior es correcta, puede desacoplar la lógica de servlet/jsp de la lógica de procesamiento de negocios y llamar a las clases de capa de lógica de negocios directamente desde las tareas programadas.

0

Use URLConnection, o http-client de apache-commons con localhost/127.0.0.1 - por lo tanto, se enrutará correctamente.

+1

Eso supone que el servidor está escuchando en 127.0.0.1, que no siempre es el caso. – skaffman

+0

¿qué hay de 0.0.0.0? :) – Bozho

0

El código de servlet tiene demasiadas responsabilidades. Reformúlelo en una clase simple de Java y deje que la clase de tarea acceda a él (o al revés, permita que visite la clase de tarea). Si es necesario, haga un uso prudente del ServletContext.

Si elabora un poco más sobre el problema real y el requisito funcional para los que cree que esta es la solución, podemos obtener mejores sugerencias.

+0

"problema real y requisito funcional": Realmente no necesito hacer esto, solo quiero saber si podría. – Thilo

+0

Puede hacerlo con 'java.net.URLConnection' o Apache Commons HttpClient como se menciona varias veces. La imagen completa es, sin embargo, un poco olorosa, solo quería advertir sobre eso antes de que sea demasiado tarde. – BalusC