2009-02-05 21 views
7

Estoy teniendo dificultades para descubrir cómo diseñar la última pieza de mi sistema. Actualmente estoy ejecutando un servidor Tomcat que tiene un servlet que responde a las solicitudes de los clientes. Cada solicitud, a su vez, agrega un mensaje de procesamiento a una cola asíncrona (probablemente utilizaré JMS a través de Spring o, más probablemente, Amazon SQS).¿Cuál es la mejor forma de procesar continuamente una cola asíncrona en Java?

La secuencia de eventos es la siguiente:

lado de envío:
1. Tome una petición de cliente
2. Agregue un poco de datos en una base de datos relacionados con esta solicitud con un identificador único
3. Añada objeto de mensaje que representa esta solicitud a la cola de mensajes

Recepción de lado:
1. Tire un nuevo objeto de mensaje de la cola
2. Separar el objeto y grab cierta información de un sitio web basada en información contenida en el objeto msg.
3. Enviar una alerta de correo electrónico
4. actualizar mi fila de base de datos (misma ID única) con la información de que la operación se completó para esta solicitud.

Estoy teniendo dificultades para encontrar la forma correcta de tratar con el lado receptor. Por un lado, probablemente pueda crear un programa Java simple que inicie desde la línea de comandos que selecciona cada elemento en la cola y lo procesa. ¿Eso es seguro? ¿Tiene más sentido tener ese programa ejecutándose como otro hilo dentro del contenedor de Tomcat? No querré hacer esto en serie, lo que significa que el receptor debe ser capaz de procesar varios objetos a la vez, utilizando múltiples hilos. Quiero que esto siempre esté en funcionamiento, las 24 horas del día.

¿Cuáles son algunas opciones para construir el lado de recepción?

+0

En caso de que alguien esté interesado en lo que finalmente terminé haciendo. Utilicé SQS de Amazon y tengo un cliente de Java (utiliza el marco de Spring) que sondea la cola. Cuando encuentra un mensaje lo procesa y vuelve al estado de espera. Podría agregar el enhebrado Quartz, por ahora solo comienzo varios procesos. – Ish

+0

Me enfrento a un problema similar. Me gustaría saber cómo se implementó Java Client. Espero que no se ejecute en un bucle while infinito y conserve el mensaje? –

Respuesta

3

"Por un lado, probablemente pueda crear un programa Java simple que inicie desde la línea de comandos que selecciona cada elemento en la cola y lo procesa. ¿Es seguro?"

¿Qué no es seguro al respecto? Funciona muy bien.

"¿Tiene más sentido tener ese programa ejecutándose como otro hilo dentro del contenedor de Tomcat?"

Solo si Tomcat tiene mucho tiempo libre para procesar el fondo. A menudo, este es el caso - usted tiene tiempo libre para hacer este tipo de procesamiento.

Sin embargo, los hilos no son óptimos. Los subprocesos comparten recursos de E/S comunes, y su subproceso de fondo puede ralentizar el front-end.

Mejor es tener una cola JMS entre el front-end del "puerto 80" y un proceso de backend independiente. El proceso de fondo se inicia, se conecta a la cola, recupera y ejecuta las solicitudes. El proceso de back-end puede (si es necesario) tener múltiples subprocesos.

0

He hecho este tipo de cosas alojando el receptor en un servidor de aplicaciones, weblogic en mi caso, pero tomcat también funciona bien. No sondee la cola, use un modelo basado en eventos. Esto podría estar codificado a mano o podría ser un servicio web basado en mensajes. Si la actualización de la base de datos es idempotente, puede actualizar la base de datos y enviar el correo electrónico, luego emitir la confirmación en la cola. No es un problema tener varios hilos que todos lean desde la misma cola.

He usado varias soluciones JMS, incluidas tibco, activemq (antes de apache) y joram. Joram era la solución de código abierto más confiable, pero eso puede haber cambiado ahora que es parte de apache.

+0

¿Puede explicar cómo implementar un modelo basado en eventos? –

+0

Eche un vistazo a http://docs.oracle.com/cd/E13222_01/wls/docs90/jms/implement.html#1188496, la sección titulada "Recibir mensajes de forma asincrónica". –

1

Si ya está utilizando Spring, consulte DefaultMessageListenerContainer. Le permite crear un bean controlado por mensaje POJO. Esto puede usarse desde dentro de un contenedor de aplicaciones existente (su archivo WAR) o como un proceso separado.

+0

En este caso, ¿el consumidor consulta continuamente la cola o recibe alguna notificación? – Ish

+0

Estoy bastante seguro de que DefaultMessageListenerContainer sondea. Lo bueno de esto es que oculta el problema de la encuesta/notificación. Simplemente implementa un MessageListener jms y realiza el trabajo que necesites hacer. –

2

Si está utilizando JMS, ¿por qué está colocando las tareas en un DB?

Puede usar una cola duradera en JMS. Esto mantendría las tareas, incluso si el intermediario de JMS muere, hasta que hayan sido reconocidas. Puede tener intermediarios redundantes para que si un intermediario muere, el segundo se haga cargo automáticamente. Esto podría ser más confiable que usar una única base de datos.

+0

Porque recuperaré cierta información del sitio web objetivo y la colocaré junto a la fila en el DB. Esta información deberá ser recuperada por un cliente en algún momento posterior. Realmente no estoy usando db tanto para la redundancia como para el almacenamiento de datos para su posterior recuperación. – Ish

Cuestiones relacionadas