2010-02-12 9 views
20

Estoy revisando una aplicación cliente-servidor escrita en Java. El servidor recibe mensajes JMS y los procesa, pero los mensajes pueden venir en un orden inesperado, y una cancelación puede llegar antes de un mensaje de pedido. ¿Cómo manejas un caso así? ¿Lo haces en el mdb?¿Cómo se maneja el orden de los mensajes en JMS?

¿Cuáles son algunas estrategias o patrones para este tipo de escenario?

Respuesta

16

Hasta ahora lo sé, esto se conoce como entrega "fuera de orden" y es parte de los atributos de calidad de servicio (QoS) del sistema JMS. No creo que sea parte de la especificación JMS, pero algunos proveedores lo admiten tal vez. Eso dependerá de la implementación de JMS particular que use.

Sin embargo, tenga en cuenta que JMS está destinado a distribuir mensajes a varios consumidores de una manera de distribuir la carga. Si el mensaje debe entregarse de manera ordenada, esto no es posible; básicamente, conduce a la serialización de la entrega del mensaje y el mensaje no se puede procesar simultáneamente.

El wikipedia lo dice mejor que yo:

cola JMS Un área de ensayo que contiene los mensajes que se han enviado y son espera de ser leído. Tenga en cuenta que, , al contrario de lo que sugiere la cola de nombres , los mensajes no tienen que ser entregados en el orden enviado. Si el mensaje piscina bean controlado contiene más de una instancia entonces los mensajes pueden ser procesan al mismo tiempo y por lo tanto es posible que un mensaje más tarde se procesada antes de lo que una anterior. Una cola JMS garantiza solo que cada mensaje se procesa solo una vez.

La solicitud de cancelación fuera de banda no es fácil de lograr con JMS. Dos ideas:

  • Almacenar un boleto que corresponde a cada mensaje en una base de datos se podría utilizar para cancelar el mensaje fácilmente. Cuando se entrega el mensaje, el MDB verifica si el ticket correspondiente sigue siendo válido. Si es así, procede más, si no, suelta el mensaje.
  • Intente establecer el tamaño del grupo de MDB en uno. Quizás en este caso, la entrega será ordenada. Cambiar el tamaño de la piscina es la aplicación. específico del servidor, pero la mayoría de ellos admite tamaño de grupo por grupo de beans.

De lo contrario, eche un vistazo al patrón message store. De todos modos, vale la pena consultar el sitio web EAI.

+0

Gracias, voy a echar un vistazo a este – user271858

8

Su sistema será mucho más flexible si puede hacer frente a los mensajes fuera de servicio. El patrón que he usado para resolver esto en el pasado es usar una cola de espera (en un sistema que procesa 8 millones de mensajes por día en el mundo financiero).

En su ejemplo, si recibí una eliminación para una orden que aún no había recibido, la demoraría por un período de tiempo y volvería a intentar. Si todavía no sabía nada sobre el pedido que me piden que elimine, generaría algún tipo de error (respuesta al remitente original, envíe un mensaje a una cola de error especial, ...).

En cuanto a la implementación de la cola de espera, esta puede ser otra cola JMS con un servicio que puede aceptar que los mensajes se retrasen. A continuación, lee periódicamente los mensajes demorados y comprueba si el período de tiempo retrasado ha expirado y vuelve a enviar el mensaje a la cola de destino original.

+0

Gracias, echaré un vistazo a esto. – user271858

6

En segundo lugar, el consejo sobre la comprobación del sitio de EAI y el libro en el que se basa (un texto fantástico sobre patrones de MOM y MOM). Sin embargo, personalmente investigaría el Resequencer.

+0

Gracias, voy a echar un vistazo a esto. – user271858

Cuestiones relacionadas