2010-10-29 3 views
5

Ich versuche eine Multithread-Implementierung für die JMS-Nachrichtenverarbeitung aus einer Warteschlange zu schreiben.Multithread-JMS-Empfang im Frühjahr

Ich habe versucht mit DefaultMessageListenerContainer und SimpleMessageListenerContainer Klassen.

Das Problem, das ich habe, ist, dass es scheint, dass nur eine einzige Instanz der MessageListener-Klasse jemals instanziiert wird, egal wie ich es konfiguriere. Dies zwingt mich unnötigerweise statusfreie oder threadsichere MessageListener-Implementierungen zu schreiben, da ich den ListenerContainer so konfiguriert habe, dass er mehrere Threads verwendet (concurrentConsumers = 8).

Gibt es eine offensichtliche Lösung, die ich übersehe?

Antwort

5

Dies ist von Entwurf. Die MessageListener ist eine Abhängigkeit, die Sie in Spring injizieren - es hat keine Möglichkeit neue zu instantiieren.

Dies zwingt mich staatenlos oder Thread-sichere Message Implementierungen

Sie diesen Sound machen wie eine schlechte Sache unnötig zu schreiben. Machen Sie Ihre MessageListener ist eine sehr gute Idee, entfernt Frühling einfach die Versuchung, anders zu machen.

+0

Ich verstehe nicht. Ich mache meinen MessageListener. Ich will nur, dass es die Multi-Cores meiner Maschine nutzt, um Dinge parallel zu verarbeiten. –

+2

@Iker: Ja, und der MessageListenerContainer erzeugt mehrere Threads, wobei alle Threads dieselbe Instanz Ihres 'MessageListener' verwenden. Das Erzeugen mehrerer Listener ist ineffizient und unnötig. – skaffman

+0

Ok, das verstehe ich. Aber sagen wir, dass Sie für jede JMS-Nachricht einen Job verarbeiten müssen, der ein paar Sekunden dauert. Ich möchte in der Lage sein, eine vollständig separate Reihe von Instanzen zu verwenden, um jede der Nachrichten zu verarbeiten. Sollte ich dann Threads vom MessageListener spawnen? –

1

„concurrentConsumers“ Konfiguration ist gerade genug, um Nachrichten gleichzeitig zu verarbeiten. Dies bedeutet nicht, dass Sie "n" Instanzen von MessageListenerContainer haben. Der MessageListenerContainer kann intern "Aufgaben" umfassen, um die Nachrichten zu verarbeiten. Optional müssen Sie möglicherweise Ihre Protokollierung entsprechend konfigurieren, um die Informationen zu den zugrunde liegenden Tasks/Threads anzuzeigen. Weitere Informationen finden Sie unter "Tuning JMS message consumption in Spring".