Spring предусматривает пространство имен XML для упрощения конфигурации JMS. Чтобы использовать элементы пространства имен JMS, необходимо сослаться на схему JMS, как показано в следующем примере:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:jms="http://www.springframework.org/schema/jms" (1)
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/jms https://www.springframework.org/schema/jms/spring-jms.xsd">
    <!-- определения бинов здесь -->
</beans>
  1. Ссылка на схему JMS.

Пространство имен состоит из трех элементов верхнего уровня: <annotation-driven/>, <listener-container/> и <jca-listener-container/>. <annotation-driven/> позволяет использовать конечные точки слушателей, управляемых аннотациями. <listener-container/> и <jca-listener-container/> определяют общую конфигурацию контейнера слушателей и могут содержать дочерние элементы <listener/>. В следующем примере показана базовая конфигурация для двух слушателей:

<jms:listener-container>
    <jms:listener destination="queue.orders" ref="orderService" method="placeOrder"/>
    <jms:listener destination="queue.confirmations" ref="confirmationLogger" method="log"/>
</jms:listener-container>

Предыдущий пример эквивалентен созданию двух разных определений бина контейнера слушателя и двух разных определений бина MessageListenerAdapter. Помимо атрибутов, показанных в предыдущем примере, элемент listener может содержать несколько необязательных атрибутов. В следующей таблице описаны все доступные атрибуты:

Таблица 3. Атрибуты JMS-элемента
Атрибут Описание

id

Имя бина для контейнера слушателя хостинга. Если не задано, имя бина генерируется автоматически.

destination (required)

Имя адреса назначения для этого слушателя, разрешенное с помощью стратегии DestinationResolver.

ref (required)

Имя бина объекта-обработчика.

method

The name of the handler method to invoke. If the ref attribute points to a MessageListener or Spring SessionAwareMessageListener, you can omit this attribute.

response-destination

Имя метода обработчика, который нужно вызвать. Если атрибут ref указывает на MessageListener или SessionAwareMessageListener из Spring, можно опустить этот атрибут.

subscription

The name of the durable subscription, if any.

selector

An optional message selector for this listener.

concurrency

The number of concurrent sessions or consumers to start for this listener. This value can either be a simple number indicating the maximum number (for example, 5) or a range indicating the lower as well as the upper limit (for example, 3-5). Note that a specified minimum is only a hint and might be ignored at runtime. The default is the value provided by the container.

Элемент <listener-container/> также принимает несколько необязательных атрибутов. Это позволяет настраивать различные стратегии (например, taskExecutor и destinationResolver), а также основные параметры JMS и ссылки на ресурсы. Используя эти атрибуты, можно определять контейнеры слушателей с высокой степенью индивидуализации и при этом пользоваться преимуществами пространства имен.

Можно автоматически передавать такие параметры как JmsListenerContainerFactory, указав id бина для передачи через атрибут factory-id, как показано в следующем примере:

<jms:listener-container connection-factory="myConnectionFactory"
        task-executor="myTaskExecutor"
        destination-resolver="myDestinationResolver"
        transaction-manager="myTransactionManager"
        concurrency="10">
    <jms:listener destination="queue.orders" ref="orderService" method="placeOrder"/>
    <jms:listener destination="queue.confirmations" ref="confirmationLogger" method="log"/>
</jms:listener-container>

В следующей таблице описаны все доступные атрибуты. Более подробную информацию об отдельных свойствах смотрите в javadoc на уровне класса по AbstractMessageListenerContainer и его конкретным подклассам. В javadoc также приводится описание выбора транзакций и сценариев повторной доставки сообщений.

Таблица 4. Атрибуты JMS-элемента <listener-container>
Атрибут Описание

container-type

Тип этого контейнера слушателя. Доступные параметры: default, simple, default102 или simple102 (параметр по умолчанию – default).

container-class

Кастомный класс реализации контейнера слушателя в виде полного имени класса. По умолчанию используется стандартный для Spring DefaultMessageListenerContainer или SimpleMessageListenerContainer в соответствии с атрибутом container-type.

factory-id

Открывает настройки, определенные этим элементом, в виде JmsListenerContainerFactory с заданным id, чтобы их можно было повторно использовать с другими конечными точками.

connection-factory

Ссылка на JMS-бин ConnectionFactory (имя бина по умолчанию – connectionFactory).

task-executor

Ссылка на TaskExecutor из Spring для инициаторов вызова слушателей JMS.

destination-resolver

Ссылка на стратегию DestinationResolver для разрешения экземпляров Destination из JMS.

message-converter

Ссылка на стратегию MessageConverter для преобразования JMS-сообщений в аргументы метода слушателя. По умолчанию используется SimpleMessageConverter.

error-handler

Ссылка на стратегию ErrorHandler для обработки любых неперехваченных исключений, которые могут генерироваться во время выполнения MessageListener.

destination-type

Тип адреса назначения JMS для этого слушателя: queue, topic, durableTopic, sharedTopic или sharedDurableTopic. Потенциально активирует свойства контейнера pubSubDomain, subscriptionDurable и subscriptionShared. По умолчанию используется значение queue (которое дезактивирует эти три свойства).

response-destination-type

Тип адреса назначения JMS для ответов: queue или topic. По умолчанию используется значение атрибута destination-type.

client-id

Идентификатор клиента JMS для этого контейнера слушателя. Нужно задавать его при использовании долговременных подписок.

cache

Уровень кэша для ресурсов JMS: none, connection, session, consumer или auto. По умолчанию (auto) уровень кэша по существу является consumer, если только не был задан внешний диспетчер транзакций – в этом случае фактическим значением по умолчанию будет none (предполагая управление транзакциями в стиле Java EE, где данный ConnectionFactory является XA-совместимым пулом).

acknowledge

Нативный режим подтверждения для JMS: auto, client, dups-ok или transacted. Значение transacted активирует локальную транзакционную Session. Кроме того, можно задать атрибут transaction-manager, описанный далее в таблице. По умолчанию используется auto.

transaction-manager

Ссылка на внешний PlatformTransactionManager (обычно это координатор транзакций на основе XA, например, JtaTransactionManager из Spring). Если не задано, используется нативное подтверждение (см. атрибут acknowledge).

concurrency

Количество параллельных сессий или потребителей, которые необходимо запустить для каждого слушателя. Может быть либо простым числом, обозначающее максимальное количество (например, 5), либо диапазоном, обозначающим как нижнюю, так и верхнюю границу (например, 3-5). Обратите внимание, что указанный минимум является лишь подсказкой и может быть проигнорирован во время выполнения. По умолчанию используется значение 1. Следует ограничить параллелизм до 1 в случае слушателя темы или если важно упорядочение очереди. Учтите возможность увеличения этого параметра для общих очередей.

prefetch

Максимальное количество сообщений, загружаемых в одну сессию. Обратите внимание, что увеличение этого числа может привести к "голоданию" одновременных потребителей.

receive-timeout

Время ожидания (в миллисекундах), которое будет использоваться для вызовов приема. По умолчанию – 1000 (одна секунда). -1 означает отсутствие времени ожидания.

back-off

Задает экземпляр BackOff, используемый для расчета интервала между попытками восстановления. Если реализация BackOffExecution возвращает BackOffExecution#STOP, контейнер слушателя больше не пытается восстановиться. Значение recovery-interval игнорируется при установке этого свойства. По умолчанию используется FixedBackOff с интервалом 5000 миллисекунд (то есть пять секунд).

recovery-interval

Задает интервал между попытками восстановления, в миллисекундах. Предусматривает удобный способ создания FixedBackOff с заданным интервалом. Чтобы получить больше возможностей восстановления, вместо этого укажите экземпляр BackOff. Значение по умолчанию составляет 5000 миллисекунд (то есть пять секунд).

phase

Фаза жизненного цикла, в рамках которой этот контейнер должен запускаться и останавливаться. Чем меньше значение, тем раньше запускается этот контейнер и тем позже он останавливается. По умолчанию используется Integer.MAX_VALUE, что означает, что контейнер запускается как можно позже и останавливается как можно раньше.

Настройка контейнера слушателя на основе JCA с поддержкой схемы jms очень похожа, и это можно увидеть в следующем примере:

<jms:jca-listener-container resource-adapter="myResourceAdapter"
        destination-resolver="myDestinationResolver"
        transaction-manager="myTransactionManager"
        concurrency="10">
    <jms:listener destination="queue.orders" ref="myMessageListener"/>
</jms:jca-listener-container>

В следующей таблице описаны доступные варианты конфигурации для варианта JCA:

Таблица 5. Атрибуты JMS-элемента <jca-listener-container/>
Атрибут Описание

factory-id

Открывает настройки, определенные этим элементом, в виде JmsListenerContainerFactory с заданным id, чтобы их можно было повторно использовать с другими конечными точками.

resource-adapter

Ссылка на бин ResourceAdapter из JCA (имя бина по умолчанию – resourceAdapter).

activation-spec-factory

Ссылка на JmsActivationSpecFactory. По умолчанию происходит автоматическое обнаружение JMS-поставщика и его класса ActivationSpec (см. DefaultJmsActivationSpecFactory).

destination-resolver

Ссылка на стратегию DestinationResolver для разрешения Destinations из JMS.

message-converter

Ссылка на стратегию MessageConverter для преобразования JMS-сообщений в аргументы метода слушателя. По умолчанию используется SimpleMessageConverter.

destination-type

JMS-тип адреса назначения для слушателя: queue, topic, durableTopic, sharedTopic или sharedDurableTopic. Потенциально активирует свойства pubSubDomain, subscriptionDurable и subscriptionShared контейнера. По умолчанию используется значение queue (которое дезактивирует эти три свойства).

response-destination-type

Тип адреса назначения JMS для ответов: queue или topic. По умолчанию используется значение атрибута destination-type.

client-id

Идентификатор клиента JMS для этого контейнера слушателя. Его необходимо задавать при использовании долговременных подписок.

acknowledge

Нативный режим подтверждения для JMS: auto, client, dups-ok или transacted. Значение transacted активирует локальную транзакционную Session. Кроме того, можно задать атрибут transaction-manager, описанный далее. По умолчанию используется auto.

transaction-manager

Ссылка на Spring JtaTransactionManager или javax.transaction.TransactionManager для запуска XA-транзакции для каждого входящего сообщения. Если не задано, используется нативное подтверждение (см. атрибут acknowledge).

concurrency

Количество параллельных сессий или потребителей, которые необходимо запустить для каждого слушателя. Может быть либо простым числом, обозначающее максимальное количество (например, 5), либо диапазоном, обозначающим как нижнюю, так и верхнюю границу (например, 3-5). Обратите внимание, что указанный минимум является лишь подсказкой и обычно игнорируется во время выполнения, если используется контейнер слушателя JCA. По умолчанию используется значение 1.

prefetch

Максимальное количество сообщений, загружаемых в одну сессию. Обратите внимание, что увеличение этого числа может привести к "голоданию" одновременных потребителей.