Frage

Ich habe einen .NET-Dienst, den das ActiveMQ-Client verwendet. Ich habe eine Message mit einer getätigten Verbindung implementiert, um die Nachrichten zu konsumieren.

Gelegentlich bekomme ich Nachrichten in einer anderen Reihenfolge, in der sie in die Warteschlange gestellt wurden.

War es falsch, einen MessageListner zu benutzen? Gibt es einen Weg, um die Nachricht zu erhalten?

Zur Info:. Es ist ein Hersteller Nachricht in der Warteschlange und ein Verbraucher ziehen Nachrichten aus der Warteschlange setzen

War es hilfreich?

Lösung 2

Weitere Informationen: Der Server Ich rufe ist Dritter und ich habe keine Kontrolle darüber, was Nachrichten sendet. Ich weiß, bezogen auf die Nachricht IDs, dass sie in die richtige Reihenfolge gebracht zu werden. Auch in diesem System gibt es einen Unterschied zwischen ACK und quittiert. Der ACK empfangen wird, wenn meine ursprüngliche Nachricht auf den der „outbound“ Warteschlange gestellt wird. Ich habe dann eine „inbound“ Warteschlange für Antworten überwachen. Ich bekomme in der Regel ein „Quittieren“, gefolgt von einem „Pass“ oder „Fail“. Die Korrelations-ID für diese Nachrichten ist die Message-ID aus der ACK.

Ich hatte ursprünglich verwendet eine Nachricht Hörer und reagiert auf ein OnMessge Ereignis. Ich ließ diesen Ansatz danach zu realisieren, mit dieser Methode, Nachrichten werden asynchron und somit in keiner bestimmten Reihenfolge geliefert. Also änderte ich meinen Code einen Timer (System.Threading.Timer) abzufragen, indem rufen consumer.Receive () und eine Nachricht zu einem Zeitpunkt erhalten. Dies funktioniert so, wie ich will.

Ich öffne die Verbraucher einmal, wenn der Dienst gestartet wird, und ich abfragen, kontinuierlich für Nachrichten.

Andere Tipps

Sie sollten nicht alles tun, um die Ordnung aufrecht zu erhalten; das ist eines der Dinge, die eine Nachrichtenwarteschlange für Sie tut. Ich würde denken, dass, wenn Sie einen einzelnen Verbraucher in die Warteschlange zu hören, und es wird Verarbeitung von Nachrichten aus der Ordnung, dann haben Sie entweder einen Fehler oder die Nachrichten zu finden sind Sie denken, nicht die Warteschlange eingereiht in der Reihenfolge, wie sie sind.

Außerdem gibt es diese Frage von dem ActiveMQ FAQ das könnte helfen.

Edit: Aus dem Lesen der Kommentare auf Antwort der duffymo, sieht es aus wie Sie ein bisschen sind Overengineering. Im Allgemeinen wird eine Nachrichtenwarteschlange wie ActiveMQ, MQ Series, joram usw. haben zwei Eigenschaften: sie Nachrichten in der gleichen Reihenfolge liefern, in denen sie die Warteschlange eingereiht werden, und sie garantieren die Nachrichtenübermittlung. eine separate ACK Nachricht gesendet ist überflüssig; es ist ein bisschen wie eine Datenbanktransaktion zu begehen, dann wieder auf die gleichen Informationen abfragt doppelt überprüfen, dass die Datenbank tatsächlich gespeichert.

Having said that, wird Ihr Server multithreaded? Wenn dies der Fall kann es möglich, dass es die Antwort auf enqueue vor es reiht die ACK.

Warum ist Nachrichtenreihenfolge wichtig? Ein Message sollte nicht zu kümmern.

Wenn Sie eine Korrelations-ID benötigen eine Antwort mit einer bestimmten Anforderung zu entsprechen, ist das eine andere Sache. Ist das, was Sie?

Alles Jason gerade gesagt hat. Ein paar andere Dinge, vorsichtig zu sein. Sie halten die Verbraucher offen für viele Nachrichten nicht wahr? Sie sind nicht ein Verbraucher für ein paar Erstellen von Nachrichten zu schließen es dann? Nur Schließen Verbraucher-Nachrichten mit einem Verbraucher zugeordnet verursacht auf eine Warteschlange zu stellen, die Ordnung brechen kann.

Ist es zu Rollbacks zu tun? (Sind Sie alle Transaktionen ein Rollback?).

Schließlich können Sie immer, um sicherzustellen, indem sie mit einem Resequencer Dinge neu zu ordnen für Sie.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top