Начиная с версии 2.5, Spring также обеспечивает поддержку контейнера MessageListener на базе JCA. JmsMessageEndpointManager предпринимает попытки автоматического определения имени класса ActivationSpec из имени класса ResourceAdapter поставщика. Поэтому, как правило, можно указать общий JmsActivationSpecConfig из Spring, как показано в следующем примере:

<bean class="org.springframework.jms.listener.endpoint.JmsMessageEndpointManager">
    <property name="resourceAdapter" ref="resourceAdapter"/>
    <property name="activationSpecConfig">
        <bean class="org.springframework.jms.listener.endpoint.JmsActivationSpecConfig">
            <property name="destinationName" value="myQueue"/>
        </bean>
    </property>
    <property name="messageListener" ref="myMessageListener"/>
</bean>

Как вариант, можно установить JmsMessageEndpointManager с заданным объектом ActivationSpec. Объект ActivationSpec также можно получить из поискового запроса через JNDI (с помощью <jee:jndi-lookup>). В следующем примере показано, как это сделать:

<bean class="org.springframework.jms.listener.endpoint.JmsMessageEndpointManager">
    <property name="resourceAdapter" ref="resourceAdapter"/>
    <property name="activationSpec">
        <bean class="org.apache.activemq.ra.ActiveMQActivationSpec">
            <property name="destination" value="myQueue"/>
            <property name="destinationType" value="javax.jms.Queue"/>
        </bean>
    </property>
    <property name="messageListener" ref="myMessageListener"/>
</bean>

Используя ResourceAdapterFactoryBean, можно сконфигурировать целевой ResourceAdapter локально, как показано в следующем примере:

<bean id="resourceAdapter" class="org.springframework.jca.support.ResourceAdapterFactoryBean">
    <property name="resourceAdapter">
        <bean class="org.apache.activemq.ra.ActiveMQResourceAdapter">
            <property name="serverUrl" value="tcp://localhost:61616"/>
        </bean>
    </property>
    <property name="workManager">
        <bean class="org.springframework.jca.work.SimpleTaskWorkManager"/>
    </property>
</bean>

Заданный WorkManager может также указывать на специфический для окружения пул потоков – обычно через свойство asyncTaskExecutor экземпляра SimpleTaskWorkManager. Рассмотрите возможность определения общего пула потоков для всех экземпляров ResourceAdapter, если используется несколько адаптеров.

В некоторых окружениях (например, версия WebLogic 9 или выше) можно вместо этого получить весь объект ResourceAdapter из JNDI (используя <jee:jndi-lookup>). Слушатели сообщений на базе Spring могут затем взаимодействовать с размещенными на сервере ResourceAdapter, которые также используют встроенный WorkManager сервера.

Более подробную информацию смотрите в javadoc по JmsMessageEndpointManager, JmsActivationSpecConfig и ResourceAdapterFactoryBean.

Spring также предусматривает типизированный диспетчер конечных точек сообщений JCA, который не привязан к JMS: org.springframework.jca.endpoint.GenericMessageEndpointManager. Этот компонент позволяет использовать любой тип слушателя сообщений (например, MessageListener из JMS) и любой специфический для поставщика объект ActivationSpec. Обратитесь к документации поставщика JCA, чтобы узнать о реальных возможностях вашего коннектора, а также ознакомьтесь с javadoc по GenericMessageEndpointManager для получения подробной информации о конфигурации, специфичной для Spring.

Управление конечными точками сообщений на основе JCA очень схоже с управлением бинами, управляемыми сообщениями, из EJB 2.1. Оно использует один и тот же базовый контракт поставщика ресурсов. Как и в случае с MDB-объектами на основе EJB 2.1, можно использовать любой интерфейс слушателя сообщений, поддерживаемый JCA-поставщиком, в контексте Spring. Spring, тем не менее, предусматривает явную "вспомогательную" поддержку для JMS, поскольку JMS является наиболее распространенным API конечных точек, используемым с контрактом управления конечными точками JCA.