Spring JMS MessageListenerContainer одновременно получает сообщения?

Я хотел бы знать, что произойдет, если MessageListenerContainer, указывающий на тему, получит 2 (или более) сообщения одновременно.

Например, 2 пользователя приложения запускают публикацию одновременно, поэтому 2 jmstemplate вызывают отправку 2 разных сообщений в одну и ту же тему.

Как контейнер справится с этим?

  1. Будет ли контейнер создавать 2 потока, вызывающих MessageListenerAdapter (который должен быть реализован как потокобезопасный) одновременно?
  2. Или в контейнере будет только 1 поток, последовательно (последовательно) вызывающий MessageListenerAdapter?

person Carlos Jaime C. De Leon    schedule 07.06.2013    source источник


Ответы (1)


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

<jms:listener-container
  container-type="default"
  connection-factory="connectionFactory"
  acknowledge="auto"
  concurrency="1"     
  cache="consumer">
  <jms:listener destination="TEST.FOO" 
                ref="simpleMessageListener"
                method="onMessage" />
</jms:listener-container>

Смотрите и это тоже ... https://stackoverflow.com/a/5808803/791406

Spring Docs ... http://static.springsource.org/spring/docs/3.0.5.RELEASE/api/org/springframework/jms/listener/DefaultMessageListenerContainer.html

person raffian    schedule 07.06.2013
comment
спасибо за ответ. но если я установлю для параллелизма значение 1, означает ли это, что 2 сообщения, одновременно полученные контейнером / адаптером, будут обрабатываться последовательно, а не параллельно? - person Carlos Jaime C. De Leon; 08.06.2013
comment
Да, для темы с 1 слушателем на узел 2 отдельных сообщения будут обрабатываться последовательно. Если вы установите concurrency > 1 для одной и той же темы, одно и то же сообщение будет обрабатываться параллельно для каждого слушателя; это вроде бессмысленно для тем. Какой у вас вариант использования; что в сообщении? Если это новостная трансляция или что-то подобное, используйте темы, но если вам требуется однократная обработка любого уникального сообщения, например, для заказа на поставку клиента, используйте очередь и установите concurrency > 1 для параллельной обработки множества сообщений. - person raffian; 08.06.2013