Параллелизм с темой JMS в Spring

Как использовать параллелизм в темах jms с помощью spring? Как и для очередей, мы можем установить свойства maxConcurrentConsumers на желаемое число. Но если я сделаю это для темы JMS, это приведет к одновременному использованию одного и того же сообщения, что нежелательно.

Может кто-нибудь указать мне в правильном направлении?


person user3544133    schedule 17.04.2014    source источник
comment
Так работают темы. Вы используете неправильный тип назначения JMS для своей цели. Вместо этого используйте назначение очереди JMS.   -  person SpaceTrucker    schedule 17.04.2014
comment
Тогда почему ejb позволяет это? На самом деле я переношу существующий проект ejb на spring, и вот как это делается в ejb.   -  person user3544133    schedule 17.04.2014
comment
@user3544133 meta.stackexchange.com/ вопросы/5234/   -  person Eugene    schedule 17.04.2014


Ответы (2)


Ну, вы сами сказали это в комментарии, но просто для уточнения.

Внутри вашего слушателя вы по-прежнему можете создавать несколько потоков и выполнять обработку асинхронным способом. Как только вы получите свои сообщения, отправьте их асинхронному потребителю. Это довольно легко реализовать, например, с помощью какого-то исполнителя.

Я бы предпочел EventBus гуавы. Это так просто, но так легко настроить и использовать. Но это ваш выбор на самом деле.

person Eugene    schedule 17.04.2014

Вы используете DefaultMessageListenerContainer неправильно. Из документов:

Обратите внимание, что динамическое масштабирование действительно имеет смысл только для очереди; для темы вы обычно придерживаетесь числа по умолчанию 1 потребитель, иначе вы получите одно и то же сообщение несколько раз на одном и том же узле.

Чтобы помочь в вашей ситуации, вы можете пересылать сообщения из темы в очередь и позволять своим потребителям потреблять из этой очереди. Если у вашего провайдера JMS есть функция переадресации, это просто изменение конфигурации вашего приложения.

person SpaceTrucker    schedule 17.04.2014
comment
Верный! Но наше приложение огромно, и мы получаем тысячи сообщений в час! Кроме того, есть 5 разных тем, которые указывают на один и тот же класс слушателей. В этом случае параллелизм необходим, чтобы сделать обработку быстрой. Поскольку я не могу добиться этого с помощью тем, я думаю о внесении изменений в код моего класса слушателя (того, который слушает 4 разные темы). На данный момент я рассматриваю возможность использования исполнителя задач, который реализует какую-то логику потоков для внутреннего управления обработкой. Пожалуйста, поправьте меня, если я ошибаюсь. Спасибо!! :) - person user3544133; 17.04.2014
comment
@user3544133 тысячи сообщений в час вы понимаете, что на самом деле это очень мало, верно? - person Eugene; 17.04.2014