2008-10-24 14 views
6

Ich benutze activemq, um Anforderungen zwischen verschiedenen Prozessen zu übergeben. In einigen Fällen habe ich mehrere, doppelte Nachrichten (die Anfragen sind) in der Warteschlange. Ich möchte nur einen haben. Gibt es eine Möglichkeit, eine Nachricht so zu senden, dass sie eine ältere Nachricht mit ähnlichen Attributen ersetzt? Wenn nicht, gibt es eine Möglichkeit, die Warteschlange zu überprüfen und nach einer Nachricht mit bestimmten Attributen zu suchen (in diesem Fall werde ich die neue Nachricht nicht senden, wenn eine ältere existiert).Ersetzen einer Nachricht in einer JMS-Warteschlange

Klarstellung (basierend auf Dave's Antwort): Ich versuche tatsächlich sicherzustellen, dass es keine doppelten Nachrichten in der Warteschlange gibt, um die Verarbeitungsmenge zu reduzieren, wenn der Verbraucher die Nachricht erhält. Daher möchte ich entweder eine Nachricht ersetzen oder sie nicht einmal in die Warteschlange stellen.

Danke.

Antwort

0

Sie können die Warteschlange durchsuchen und Selektoren verwenden, um die Nachricht zu identifizieren. Wenn Sie jedoch nicht über eine kleine Anzahl von Nachrichten verfügen, wird dies nicht sehr gut skaliert. Stattdessen sollte Ihre Nachricht nur ein Zeiger auf einen Datenbank-Datensatz (oder Satz von Datensätzen) sein. Auf diese Weise können Sie den Datensatz aktualisieren, und wer die Nachricht erhält, greift dann auf die neueste Version des Datensatzes zu.

+0

Danke Dave. Ich versuche tatsächlich sicherzustellen, dass es in der Warteschlange keine doppelten Nachrichten gibt, um die Verarbeitungsmenge zu reduzieren, die auftritt, wenn der Verbraucher die Nachricht erhält. Daher möchte ich entweder eine Nachricht ersetzen oder sie nicht einmal in die Warteschlange stellen. Udi – Udi

2

Dies klingt wie ein idealer Anwendungsfall für die Idempotent Consumer, die Duplikate aus einer Warteschlange oder Thema entfernt.

Das folgende Beispiel zeigt, wie dies mit Apache Camel zu tun, was der einfachste Weg ist eine der Enterprise Integration Patterns, insbesondere zu implementieren, wenn Sie ActiveMQ verwenden die comes with Camel integrated aus dem Kasten heraus

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

Der einzige Trick, um diesen stellt sicher, dass es eine einfache Möglichkeit gibt, einen eindeutigen ID-Ausdruck für jede Nachricht zu berechnen - z. B. einen XPath aus dem Dokument herausziehen oder wie im obigen Beispiel einen eindeutigen Nachrichtenkopf verwenden