2010-10-29 2 views
5

J'essaie d'écrire une implémentation multithread pour le traitement des messages JMS à partir d'une file d'attente.JMS multithread recevoir au printemps

J'ai essayé avec les classes DefaultMessageListenerContainer et SimpleMessageListenerContainer. Le problème que j'ai est qu'il semble que juste une seule instance de la classe MessageListener soit jamais instanciée, peu importe comment je le configure. Cela m'oblige à écrire inutilement des implémentations de MessageListener sans état ou sans thread, puisque j'ai le ListenerContainer configuré pour utiliser plusieurs threads (concurrentConsumers = 8).

Existe-t-il une solution évidente à cela que je néglige?

Répondre

5

Ceci est voulu. Le MessageListener est une dépendance que vous injectez dans Spring - il n'a aucun moyen d'en instancier de nouveaux.

Cela me force à écrire inutilement implémentations MessageListener sans état ou thread-safe

Vous faites ce son comme une mauvaise chose. Faire votre MessageListener est une très bonne idée, Spring supprime simplement la tentation de faire autrement.

+0

Je ne comprends pas. Je fais mon MessageListener. Je veux juste qu'il profite des multi-cœurs de ma machine pour traiter les choses en parallèle. –

+2

@Iker: Oui, et le MessageListenerContainer engendrera plusieurs threads pour cela, avec tous les threads utilisant la même instance de 'MessageListener'. La multiplication d'auditeurs est inefficace et inutile. – skaffman

+0

Ok, que je comprends. Mais disons que pour chaque message JMS, vous devez traiter un travail qui prend quelques secondes. Je veux pouvoir utiliser un ensemble d'instances complètement distinct pour traiter chacun des messages. Devrais-je générer des threads à partir de MessageListener alors? –

1

Configuration « concurrentConsumers » est juste assez pour traiter les messages en même temps. Cela ne signifie pas que vous aurez "n" instances de MessageListenerContainer. Le MessageListenerContainer peut couvrir des "tâches" en interne pour traiter les messages. En option, vous devrez peut-être configurer votre journalisation en conséquence pour voir les informations associées aux tâches/threads sous-jacents.

Voir «Tuning JMS message consumption in Spring» pour plus de détails.