对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

JCA 消息端点支持

从 2.5 版本开始,Spring 还提供了基于 JCA 的MessageListener容器支持。JmsMessageEndpointManager会尝试根据提供者的ActivationSpec类名自动确定ResourceAdapter类名。因此,通常可以像下面示例所示那样,直接提供 Spring 通用的JmsActivationSpecConfigspring-doc.cadn.net.cn

<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 对象来配置一个 ActivationSpecActivationSpec 对象也可以通过 JNDI 查找获得(使用 <jee:jndi-lookup>)。以下示例展示了如何进行此操作:spring-doc.cadn.net.cn

<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="jakarta.jms.Queue"/>
		</bean>
	</property>
	<property name="messageListener" ref="myMessageListener"/>
</bean>

使用 Spring 的 ResourceAdapterFactoryBean,您可以像下面示例所示那样在本地配置目标 ResourceAdapterspring-doc.cadn.net.cn

<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 也可以指向一个环境特定的线程池——通常通过 SimpleTaskWorkManager 实例的 asyncTaskExecutor 属性来实现。 如果你使用了多个适配器,可以考虑为所有 ResourceAdapter 实例定义一个共享的线程池。spring-doc.cadn.net.cn

在某些环境中,你可以改为直接从 JNDI 获取整个 ResourceAdapter 对象 (通过使用 <jee:jndi-lookup>)。基于 Spring 的消息监听器随后即可与 服务器托管的 ResourceAdapter 进行交互,该适配器也会使用服务器内置的 WorkManagerspring-doc.cadn.net.cn

Spring 还提供了一个通用的 JCA 消息端点管理器,该管理器不依赖于 JMS: org.springframework.jca.endpoint.GenericMessageEndpointManager。此组件允许使用任何类型的消息监听器(例如 JMS MessageListener)以及任何特定于提供者的 ActivationSpec 对象。请参阅您的 JCA 提供者文档,以了解连接器的实际功能,并参阅 GenericMessageEndpointManager 的 javadoc 以获取 Spring 特定的配置详情。spring-doc.cadn.net.cn

基于 JCA 的消息端点管理与 EJB 2.1 的消息驱动 Bean(Message-Driven Beans)非常类似。 它使用相同的底层资源提供者契约。与 EJB 2.1 MDB 一样,您也可以在 Spring 上下文中使用 JCA 提供者所支持的任何 消息监听器接口。 不过,Spring 仍然为 JMS 提供了明确的“便捷”支持,因为 JMS 是与 JCA 端点管理契约一起使用的 最常见端点 API。