2010-02-12 5 views
20

Ich überprüfe eine Client-Server-Anwendung in Java geschrieben. Der Server empfängt JMS-Nachrichten und verarbeitet sie, aber die Nachrichten können in einer unerwarteten Reihenfolge kommen, und eine Stornierung kann vor einer Bestellnachricht eintreffen. Wie gehst du mit einem solchen Fall um? Machst du es in der MDB?Wie wird die Reihenfolge der Nachrichten in JMS gehandhabt?

Was sind einige Strategien oder Muster für diese Art von Szenario?

Antwort

16

Soweit ich weiß, wird dies als "out-of-order" Lieferung bezeichnet und ist Teil der Quality of Service (QoS) -Attribute des JMS-Systems. Ich denke nicht, dass es Teil der JMS-Spezifikation ist, aber einige Anbieter unterstützen es vielleicht. Dies hängt von der jeweiligen JMS-Implementierung ab, die Sie verwenden.

Beachten Sie jedoch, dass JMS Nachrichten an mehrere Verbraucher verteilen soll, um die Last zu verteilen. Wenn die Nachricht in einer geordneten Weise zugestellt werden muss, ist dies nicht möglich - sie führte im Wesentlichen zur Serialisierung der Nachrichtenzustellung, und die Nachricht konnte nicht gleichzeitig verarbeitet werden.

Die wikipedia sagt, es besser als ich:

JMS-Warteschlange Ein Staging-Bereich, die Nachrichten enthält, die gesendet wurden und sind warten gelesen zu werden. Beachten Sie, dass im Gegensatz zu dem Namen Warteschlange schlägt vor, Nachrichten müssen in der Reihenfolge gesendet gesendet werden. Wenn der nachrichtengesteuerte Bean-Pool mehr als eine Instanz enthält, können die Nachrichten gleichzeitig verarbeitet werden, und daher ist möglich, dass eine spätere Nachricht früher verarbeitet wird als eine frühere. Eine JMS-Warteschlange garantiert nur, dass jede Nachricht nur einmal verarbeitet wird.

Die Out-of-Band-Cancel-Anforderung ist mit JMS nicht einfach zu erreichen. Zwei Ideen:

  • Speichern Sie ein Ticket, das jeder Nachricht in einer Datenbank entspricht, könnte verwendet werden, um die Nachricht einfach abzubrechen. Wenn die Nachricht zugestellt wird, prüft die MDB, ob das entsprechende Ticket noch gültig ist. Wenn ja, geht weiter, wenn nicht, die Nachricht fallen lassen.
  • Versuchen Sie, die MDB-Poolgröße auf eins zu setzen. Vielleicht wird in diesem Fall die Lieferung bestellt. Ändern der Poolgröße ist App. Serverspezifisch, aber die meisten unterstützen die Poolgröße pro Bean.

Sonst haben Sie vielleicht einen Blick auf die message store Muster. Es lohnt sich jedenfalls, die EAI Website zu überprüfen.

+0

Danke, ich werde mir das ansehen – user271858

8

Ihr System wird viel flexibler sein, wenn es mit den Out-of-Order-Nachrichten umgehen kann. Das Muster, das ich verwendet habe, um dies in der Vergangenheit zu lösen, ist die Verwendung einer Verzögerungswarteschlange (auf einem System, das 8 Millionen Nachrichten pro Tag in der Finanzwelt verarbeitet).

In Ihrem Beispiel, wenn ich eine Löschung für eine Bestellung erhalten hatte, die ich noch nicht erhalten hatte, würde ich sie für einen bestimmten Zeitraum verschieben und es erneut versuchen. Wenn ich noch nichts über die Reihenfolge wusste, die ich löschen soll, würde ich einen Fehler melden (Antwort an den ursprünglichen Absender, sende eine Nachricht an eine spezielle Fehlerwarteschlange, ...).

Bei der Implementierung der Verzögerungswarteschlange kann dies eine andere JMS-Warteschlange mit einem Dienst sein, der Nachrichten akzeptieren kann, die verzögert werden sollen. Es liest dann periodisch die verzögerten Nachrichten und prüft, ob der verzögerte Zeitraum abgelaufen ist, und sendet die Nachricht erneut an die ursprüngliche Zielwarteschlange.

+0

Danke, ich werde mir das mal ansehen. – user271858

6

Ich zweitens den Ratschlag zum Überprüfen der EAI-Site und des Buches, auf dem es basiert (ein fantastischer Text über MOMs und MOM-Muster).

Persönlich würde ich die Resequencer untersuchen, obwohl.

+0

Danke, ich werde mir das ansehen. – user271858