2011-10-27 26 views
7

Tengo un requerimiento de que necesito procesar mensajes JMS (a través de MDB) de forma que los Mensajes pertenecientes a un grupo determinado (una ID de grupo esté configurada) sean consumidos por la misma instancia de bean. El comportamiento que requiero en esto es que los mensajes con el mismo ID de grupo se procesen secuencialmente (aunque el orden de los mensajes es irrelevante) y vincularlos a la misma instancia de MDB debe proporcionar eso.Grupos de mensajes en WebSphere MQ

Los mensajes no llevan ningún tipo de número de secuencia (ya que es irrelevante) y no sabemos cuál es el primer o el último mensaje de un grupo (podría decirse que "nunca" sería un último mensaje en un grupo). . Queremos que se entreguen tan pronto como el consumidor pueda recibirlos.

ActiveMQ proporciona esta característica exacta (http://activemq.apache.org/message-groups.html) simplemente configurando JMSXGroupID. Sin embargo, estamos obligados a WebSphere MQ. Todo lo que he descubierto hasta ahora es que es posible recopilar Mensajes del mismo grupo en la cola y usar un MessageSelector para recibir un mensaje de "Último mensaje en el grupo" como se describe en http://www.ibm.com/developerworks/websphere/library/techarticles/0602_currie/0602_currie.html. Sin embargo, preferiríamos una manera más limpia (como en ActiveMQ). ¿Alguien sabe cómo lograr ese comportamiento en WebSphere?

Gracias!

Respuesta

2

Generalmente usa MessageSelectors en implementaciones de productos IBM de JMS (implementaciones de WebSphere MQ y SIBus). Estos son el equivalente de un filtro que escanearía el encabezado de un mensaje HTTP o SOAP para protocolos basados ​​en web.

Aunque puede que no sea lo que quieres, en realidad es un diseño limpio y bien pensado.

Sin embargo, si no desea utilizar MessageSelectors, probablemente tendrá que crear el suyo propio y "procesar" un mensaje con un MDB frontal que escanea los encabezados, y luego reenvía el mensaje a una cola apropiada, donde solo el MDB que se preocupa por los mensajes agrupados los procesará (una especie de patrón de selector de puerta de enlace/mensaje).

Si está utilizando la API JMS "pura", puede pedirle al objeto Session que cree un MessageConsumer con la cadena de selector especificada (valor en el encabezado) que desea filtrar (nuevamente, tiene que configurarlo usted mismo)

//assume we have created a JMS Connection and Session object already. 
//and looked up the Queue we want already. 
MessageConsumer consumerWithSelector = session.createConsumer(queue, groupId); 

Esto es todo lo que la API pura de JMS le brinda. Cualquier otra cosa depende exclusivamente del implementador de la tecnología de mensajería, que luego es propiedad de su implementación y no es un código portátil.

+0

Gracias, eso es lo que esperaba. – ftr

Cuestiones relacionadas