2016-03-24 14 views
1

Ich habe eine Nachrichtenwarteschlange mit einem Producer und einem Consumer für asynchrone Anfragen mit garantierter Zustellung mit Anwendung einiger Timeout-Richtlinien. Die Bestellung dieser Nachrichten macht keinen Sinn. Jede Nachricht ist voneinander isoliert und hat ihr eigenes Geschäftsszenario. Also brauche ich keine Reihenfolge in der Nachrichtenwarteschlange. Das Problem besteht jedoch darin, dass die Warteschlange durch die erste Nachricht blockiert wird, die nicht zugestellt werden kann. Andere Nachrichten sind korrekt und bereit, auf die richtige Art und Weise verarbeitet zu werden, aber sie müssen auf eine "schlechte" Nachricht warten, die zugestellt werden soll.Wie kann die Sortierung in ActiveMQ unterdrückt werden?

Java und JMS mit Spring auf den Queue-Client-Seiten.

Ist es möglich, ActiveMQ-Warteschlange ohne jede Bestellung, aber mit individuellen Redelivering Timeouts für jede Nachricht zu machen?

Antwort

2

Der beste Weg, um dies zu lösen, wäre eine Warteschlange pro Nachrichtentyp oder eine andere ähnliche logische Partitionierung von Nachrichten über eine Reihe von Warteschlangen zu verwenden.

Eine JMS-Warteschlange funktioniert genau wie der Name besagt, zuerst in first out. Es gibt eine Möglichkeit, Nachrichtenpriorität verwenden, um Nachrichten zu ermöglichen, um die Linie zu springen, aber es gibt viele Einschränkungen für den auf Warteschlangentiefe in Abhängigkeit usw.

Sie sind viel besser auseinander zu brechen Sie Domäne in eine logische Reihe von Warteschlangen und raubend für jeder.

+0

Ja, ich dachte über logisch eine Nachricht - eine Warteschlange, aber es sieht "hacky" (Entschuldigung, kann nicht passender Wort in Englisch zu erfinden). Wie verhält sich ActiveMQ, wenn die Anzahl der Warteschlangen Tausende beträgt? Es scheint, dass ich Logik zum Löschen alter Warteschlangen oder zum Verwalten mehrerer tausend Warteschlangenpools und zum Versenden von Nachrichten in diesen Pool benötige. Mit anderen Worten ist es möglich, Workaround, aber es ist komplizierter, dass es sein sollte. – Donz

+0

Und ich habe versucht, mit Prioritäten zu spielen - ActiveMQ nichts mit neuer Nachricht mit höherer Priorität tun, wenn alte noch nicht geliefert wurde. – Donz

+0

Lesen Sie die Dokumentation, es gibt Antworten dort für beide diese Fragen –

0

Sind Sie in einem "FIFO" -Szenario ?, dh Verarbeitungsreihenfolge muss erhalten bleiben? Wenn nicht, starten Sie mehrere Benutzer (z. B. mehrere MDB-Instanzen, in WebSphere legen Sie die Anzahl der "Slaves" pro Server in der Aktivierungsspezifikation fest) in der Warteschlange und/oder weisen Sie Ihrer Nachricht eine andere JMS-Priorität zu, um "dringlichere" Nachrichten zuerst

zu verarbeiten
+0

Nein, wie ich sagte in Frage ich brauche überhaupt keine Bestellung, also kein FIFO. Und ich habe nur Produzenten und nur Verbraucher - es ist mein eigener Mini-Integrationsbus. Ich habe versucht, mit Priorität zu spielen, aber es gibt zwei Probleme: 1. Alle meine Nachrichten sind in der Priorität gleich. Und nur die Möglichkeit, die Priorität zu verwenden - verringern Sie sie jedes Mal, wenn die Nachricht nicht zugestellt wurde. 2. Es funktioniert nicht. Wenn eine Nachricht in den Übermittlungsprozess aufgenommen wird, werden keine neuen Nachrichten trotz Priorität verarbeitet, bis der erste aus der Warteschlange ausgeht. – Donz

Verwandte Themen