2008-10-24 7 views
6

J'utilise activemq pour transmettre des requêtes entre différents processus. Dans certains cas, j'ai plusieurs messages dupliqués (qui sont des demandes) dans la file d'attente. Je voudrais en avoir seulement un. Est-il possible d'envoyer un message de manière à remplacer un ancien message par des attributs similaires? Si ce n'est pas le cas, existe-t-il un moyen d'inspecter la file d'attente et de rechercher un message avec des attributs spécifiques (dans ce cas, je n'enverrai pas le nouveau message s'il en existe un plus ancien). Clarification (basée sur la réponse de Dave): J'essaye en fait de m'assurer qu'il n'y a pas de messages en double dans la file d'attente pour réduire la quantité de traitement qui se produit chaque fois que le consommateur reçoit le message. Par conséquent, je voudrais soit remplacer un message ou même pas le mettre dans la file d'attente.Remplacement d'un message dans une file d'attente jms

Merci.

Répondre

0

Vous pouvez parcourir la file d'attente et utiliser des sélecteurs pour identifier le message. Cependant, à moins d'avoir une petite quantité de messages, cela ne se fera pas très bien. Au lieu de cela, votre message devrait simplement être un pointeur vers un enregistrement de base de données (ou un ensemble d'enregistrements). De cette façon, vous pouvez mettre à jour l'enregistrement et celui qui reçoit le message accédera alors à la dernière version de l'enregistrement.

+0

Merci Dave. J'essaie en fait de m'assurer qu'il n'y a pas de messages en double dans la file d'attente pour réduire la quantité de traitement qui se produit chaque fois que le consommateur reçoit le message. Par conséquent, je voudrais soit remplacer un message ou même pas le mettre dans la file d'attente. Udi – Udi

2

Cela ressemble à un cas d'utilisation idéal pour le Idempotent Consumer qui supprime les doublons d'une file d'attente ou d'un sujet.

L'exemple suivant montre comment faire avec Apache Camel qui est la meilleure façon de mettre en œuvre l'un des Enterprise Integration Patterns, en particulier si vous utilisez ActiveMQ qui comes with Camel integrated hors de la boîte

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

Le seul truc à ce est de s'assurer qu'il existe un moyen facile de calculer une expression ID unique sur chaque message - comme extraire un XPath du document ou utiliser comme dans l'exemple ci-dessus un en-tête de message unique