2016-08-23 6 views
0

Ich verwende Spring JMS in meiner Webanwendung in einem TomEE-Container, und ich wollte JMSXGroupIDs verwenden, um meine Nachrichten zu gruppieren. Ich verwende die folgende Spring JMS Listener Container-Konfiguration.Spring JMS Concurrency und JMSXGroupID

Für einen schnellen Test, schickte ich 1000 Nachrichten von der gleichen JMSXGroupID gruppiert. Ich habe die Threads mit VisualVM untersucht und erwartet, dass während des gesamten Tests nur ein Listener-Container aktiv ist. Was passiert ist, ist, dass die Arbeit zwischen den 5 Message-Listener-Containern aufgeteilt ist. Ich habe die ActiveMQ Web Console überprüft, und soweit der Broker betroffen ist, wurden alle Nachrichten an denselben Benutzer gesendet. Gibt es einen Grund, warum die Nachrichten auf verschiedenen Message-Listener-Container-Threads verarbeitet werden?

Antwort

1

Erstens, einige Begriffe - es gibt einen Container mit 5 Consumer-Threads (5 Verbraucher aus Sicht von ActiveMQ).

Ich habe gerade einen Test mit 5 festen Kunden durchgeführt und es hat wie erwartet funktioniert.

Wenn ich mit variablen Verbrauchern lief, sah ich Nachrichten mit der gleichen Gruppen-ID zu einem "neuen" Verbraucher, wenn der Behälter die Anzahl der Verbraucher erhöhte; es stabilisierte sich dann mit den Nachrichten, die an denselben (neuen) Verbraucher gingen.

Da ActiveMQ für die Verteilung verantwortlich ist, muss es in seinem Algorithmus etwas sein, wenn neue Konsumenten erstellt werden; Ich glaube nicht, dass es etwas mit Spring zu tun hat.

Die Umstellung auf eine feste Anzahl von Konsumenten könnte eine praktikable Lösung sein.

EDIT

Mit variablen Verbrauchern hier ist wahrscheinlich keine gute Idee ist, weil, wenn der Behälter nach unten langsam erkennt, wird es Abschaltung der Verbraucher - die ActiveMQ zwingen wird, mit einem anderen Verbraucher für die zugehörigen Gruppen zu starten.

+0

Siehe auch meine editierung. –

+0

Ich habe versucht, es auf nur 5 zu ändern und das Problem ist immer noch das gleiche. – Animal2

+0

Sind Sie sicher, dass Sie die Kopfzeile richtig einstellen? Es funktioniert jedes Mal gut für mich. Sehen Sie sich die eingehenden Nachrichten in einem Debugger an, um sicherzustellen, dass der Header festgelegt ist. 'ActiveMQTextMessage {commandId = 15, ... groupID = foo, ... text = foo}' –

0

Einige weitere Eingänge (von tomee Mailingliste kopiert, da sie nicht automatisch verlinkt wird):

1- 1 jms session = 1 Faden so, wenn Sie sie in eine Verarbeitung von Nachrichten wird keine andere Executor verwenden single thread 2- spring verwendet einen Executor für den listener-container, dieser ist derjenige, der konfiguriert wird, um das threading-modell abzustimmen

Verwandte Themen