2009-01-31 13 views
5

Actualmente tengo un contenedor de tomcat: se ejecuta el servlet para escuchar las solicitudes. Necesito que el resultado de una solicitud HTTP sea un envío a una cola de trabajos que luego se procesará de forma asíncrona. Quiero que cada "trabajo" se mantenga en una fila en un DB para el seguimiento y la recuperación en caso de error. He estado leyendo mucho. Aquí están mis opciones (nota que tengo que usar cosas de código abierto para todo).Procesamiento asíncrono en Java desde un servlet

1) JMS - utilizar ActiveMQ (pero ¿quién es el consumidor de que el trabajo en este caso otro servlet)

2) que mi petición se crea una fila en la base de datos?. Tener un servlet independiente dentro de mi contenedor de Tomcat que siempre se ejecuta; utiliza Quartz Scheduler o las utilidades provistas en java.util.concurrent para procesar continuamente las filas como trabajos (usa la agrupación de subprocesos).

Me inclino por este último porque mirar la documentación JMS me da un dolor de cabeza y, aunque sé que es una solución más robusta, necesito implementar esto relativamente rápido. No estoy anticipando grandes cantidades de carga en los primeros días de implementación de este servidor en cualquier caso.

Mucha gente dice que Spring podría ser bueno para 1 o 2. Sin embargo, nunca he usado Spring y ni siquiera sabría cómo empezar a usarlo para resolver este problema. Cualquier sugerencia sobre cómo bucear sin tener que volver a escribir todo mi proyecto sería útil.

De lo contrario, si pudiera pesar en la opción 1 o 2 también sería útil.

Aclaración: El proceso asíncrono sería rozar una pantalla de un sitio web de terceros y enviar una notificación de mensaje al solicitante original. El sitio web de terceros es un poco inestable y lento y por eso se manejará como un proceso asíncrono (varios intentos de reintento integrados). También extraeré archivos de ese sitio y los almacenaré en S3.

Respuesta

4

¡Tu trabajo de Quartz no necesita ser un servlet! Puede persistir en los trabajos entrantes en el DB y tener Quartz iniciado cuando se inicia el Servlet principal. Quartz Job puede ser un POJO simple y consultar el DB para cualquier trabajo periódicamente.

Sin embargo, le sugiero que eche un vistazo a Spring. No es difícil de aprender y easy to setup within Tomcat. Puede encontrar mucha información útil en el Spring reference documentation. Tiene la integración de Quartz, que es mucho más fácil que hacerlo manualmente.

+0

también recomiendo tanto para la primavera de cuarzo programación y mensajería JMS. Hará que el código sea mucho más simple. – kgiannakakis

1

Una solución adecuada que no requerirá mucho diseño y programación es crear el objeto que necesitará más adelante en el servlet y serializarlo en una matriz de bytes. Luego colóquelo en un campo BLOB en la base de datos y termine con eso.

Luego su hilo de procesamiento puede simplemente leer los contenidos, deserializarlo y trabajar con el objeto ressurrected.

embargo, se puede lograr mejores respuestas mediante la descripción de lo que necesita el sistema para hacer realidad :)

+0

Esa es una muy buena idea. Esto probablemente me resulte, ya que el objeto que estaría almacenando en el db simplemente contiene información sobre cómo acceder al sitio de terceros de destino y tiene una identificación única para que pueda enrutar al usuario. – Ish

Cuestiones relacionadas