2010-10-29 2 views
5

Я пытаюсь написать многопоточную реализацию для обработки сообщений JMS из очереди.Многопоточный прием JMS весной

Я пробовал с классами DefaultMessageListenerContainer и SimpleMessageListenerContainer.

Проблема заключается в том, что кажется, что только один экземпляр класса MessageListener получает экземпляр, независимо от того, как я его настраиваю. Это заставляет меня излишне писать безстоящие или потокобезопасные реализации MessageListener, так как у меня есть ListenerContainer, настроенный на использование нескольких потоков (concurrentConsumers = 8).

Есть ли очевидное решение для этого, что я не замечаю?

ответ

5

Это по дизайну. MessageListener - это зависимость, которую вы вводите в Spring - у нее нет возможности создавать новые.

Это заставляет меня излишне писать без гражданства или поточно-реализации MessageListener

Вы делаете это звучит как плохая вещь. Создание вашего MessageListener - очень хорошая идея, Spring просто устраняет соблазн сделать иначе.

+0

Не понимаю. Я делаю свой MessageListener. Я просто хочу, чтобы он использовал многоядерные процессоры моей машины для параллельной обработки. –

+2

@Iker: Да, и MessageListenerContainer создаст несколько потоков для этого, со всеми потоками, использующими один и тот же экземпляр вашего MessageListener. Нерест нескольких слушателей неэффективен и не нужен. – skaffman

+0

Хорошо, я понимаю. Но скажем, что для каждого сообщения JMS вам нужно обработать задание, которое занимает несколько секунд. Я хочу иметь возможность использовать полностью отдельный набор экземпляров для обработки каждого из сообщений. Должен ли я порождать потоки из MessageListener? –

3

Возможно, этот ответ слишком поздний, но он может принести пользу другим, кто его ищет. Короче говоря, ответ использует CommonsPoolTargetSource и ProxyFactoryBean.

Проверить эту ссылку для подробностей: http://forum.springsource.org/showthread.php?34595-MDB-vs-MDP-concurrency

Если вы хотите сделать что-то похожее на тему, проверить это: https://stackoverflow.com/a/12668538/266103

1

Настройка «concurrentConsumers» просто достаточно для обработки сообщений одновременно. Это не означает, что у вас будут «n» экземпляры MessageListenerContainer. MessageListenerContainer может охватывать «задачи» внутренне для обработки сообщений. Возможно, вам, возможно, придется настроить ведение журнала соответствующим образом, чтобы просмотреть информацию, связанную с основными задачами/потоками.

См. "Tuning JMS message consumption in Spring" для более подробной информации.