Самый быстрый способ обработки сообщений JMS от Spring-JMS - PullRequest
4 голосов
/ 19 октября 2010

У меня есть очередь JMS с gazillion сообщений для обработки.У меня будет несколько хороших слушателей, которые я реализую, используя spring-jms для чтения из этой очереди.

Я немного теряюсь в различных ListenerContainer и их возможных конфигурациях.Мои требования:

  • Очевидно, асинхронная обработка.
  • Нет необходимости в транзакциях, я могу позволить себе потерять некоторые сообщения в случае сбоя.
  • Мне нужна грубая скорость!
  • Я использую ActiveMQ в качестве посредника.

У любого есть предложение по использованию ListenerContainer и конфигурации с точки зрения количества сеансов JMS, потоков и т. Д.

Машина будет иметь 8 ядер, много оперативной памяти.

Ответы [ 2 ]

4 голосов
/ 19 октября 2010

Если у вас нет особых причин поступать иначе, вы должны использовать DefaultMessageListenerContainer. Это наиболее гибкий с точки зрения производительности и конфигурации. Напротив, SimpleMessageListenerContainer слишком прост для практического использования.

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

1 голос
/ 19 октября 2010

Я бы хотел использовать Spring Integration . Это делает настройку приложений на основе JMS действительно простой.

    <bean id="commandQueue" class="org.apache.activemq.command.ActiveMQQueue">
            <constructor-arg value="queue.command"/>
    </bean>

    <jms:message-driven-channel-adapter
    id="jmsin" destination="commandQueue" channel="commandChannel" />

    <int:channel id="commandChannel" />

Итак, в приведенном выше фрагменте XML вы создаете «канал», представляющий собой абстрактную концепцию очереди. Вы определяете свою очередь JMS как обычную, а затем просто определяете адаптер.

    <service-activator input-channel="commandChannel" 
           ref="commandWatcher" method="processCommand">
    <poller task-executor="pool">
        <interval-trigger interval="100"/>
    </poller>
</service-activator>

<bean id="commandWatcher" class="foo.bar.Pojo" scope="prototype"/>

    <bean id="pool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
 <property name="corePoolSize" value="8" />   
     </beans:bean>

Итак, приведенный выше код просто определяет «активатор службы», что означает, что каждые 100 мс он проверяет наличие сообщений в очереди. Затем он извлекает это сообщение и обрабатывает его в пуле потоков, передавая сообщение в POJO. Вы определяете простой метод, и он может воспринимать полезную нагрузку как строку, или, если у вас есть ее как сериализованный объект, вы можете иметь это. Если вам нужна дополнительная семантика, такая как заголовки, вы можете использовать аннотации и получить заголовки в виде карты.

Это делает JMS таким же безболезненным, как это бывает ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...