2008-10-24 26 views
6

Estoy usando activemq para pasar solicitudes entre diferentes procesos. En algunos casos, tengo varios mensajes duplicados (que son solicitudes) en la cola. Me gustaría tener solo uno. ¿Hay alguna manera de enviar un mensaje de manera que reemplace un mensaje anterior con atributos similares? Si no lo hay, ¿hay alguna manera de inspeccionar la cola y comprobar si hay un mensaje con atributos específicos (en este caso, no enviaré el nuevo mensaje si existe uno más antiguo).Reemplazar un mensaje en una cola jms

Aclaración (basada en la respuesta de Dave): De hecho, estoy tratando de asegurarme de que no haya ningún mensaje duplicado en la cola para reducir la cantidad de procesamiento que ocurre cada vez que el consumidor recibe el mensaje. Por lo tanto, me gustaría reemplazar un mensaje o incluso no ponerlo en la cola.

Gracias.

Respuesta

0

Puede explorar la cola y usar selectores para identificar el mensaje. Sin embargo, a menos que tenga una pequeña cantidad de mensajes, esto no se escalará muy bien. En cambio, su mensaje debería ser simplemente un puntero a un registro de base de datos (o conjunto de registros). De esta forma, puede actualizar el registro y quien reciba el mensaje accederá a la última versión del registro.

+0

Gracias Dave. De hecho, estoy tratando de asegurarme de que no haya mensajes duplicados en la cola para reducir la cantidad de procesamiento que ocurre cada vez que el consumidor recibe el mensaje. Por lo tanto, me gustaría reemplazar un mensaje o incluso no ponerlo en la cola. Udi – Udi

2

Esto suena como un caso de uso ideal para el Idempotent Consumer que elimina los duplicados de una cola o tema.

El siguiente ejemplo muestra cómo hacer esto con Apache Camel que es la forma más fácil de poner en práctica cualquiera de los Enterprise Integration Patterns, sobre todo si está utilizando ActiveMQ cuales comes with Camel integrated fuera de la caja

from("activemq:queueA"). 
    idempotentConsumer(memoryMessageIdRepository(200)). 
    header("myHeader"). 
    to("activemq:queueB"); 

El único truco para esto se asegura de que haya una manera fácil de calcular una expresión de identificación única en cada mensaje, como sacar un XPath del documento o usar como en el ejemplo anterior un encabezado de mensaje único

Cuestiones relacionadas