支持 JCA 消息端点
从 2.5 版本开始,Spring 还提供了对基于 JCA 的 MessageListener
容器的支持。JmsMessageEndpointManager
尝试从提供者的 ResourceAdapter
类名中自动确定 ActivationSpec
类名。因此,通常可以提供 Spring 的通用 JmsActivationSpecConfig
,如下例所示:
- Java
- Kotlin
- Xml
@Bean
public JmsMessageEndpointManager jmsMessageEndpointManager(ResourceAdapter resourceAdapter,
MessageListener myMessageListener) {
JmsActivationSpecConfig specConfig = new JmsActivationSpecConfig();
specConfig.setDestinationName("myQueue");
JmsMessageEndpointManager endpointManager = new JmsMessageEndpointManager();
endpointManager.setResourceAdapter(resourceAdapter);
endpointManager.setActivationSpecConfig(specConfig);
endpointManager.setMessageListener(myMessageListener);
return endpointManager;
}
@Bean
fun jmsMessageEndpointManager(
resourceAdapter: ResourceAdapter, myMessageListener: MessageListener) = JmsMessageEndpointManager().apply {
setResourceAdapter(resourceAdapter)
activationSpecConfig = JmsActivationSpecConfig().apply {
destinationName = "myQueue"
}
messageListener = myMessageListener
}
<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>
或者,您可以使用给定的 ActivationSpec
对象设置一个 JmsMessageEndpointManager
。ActivationSpec
对象也可以通过 JNDI 查找(使用 <jee:jndi-lookup>
)获取。以下示例展示了如何进行设置:
- Java
- Kotlin
- Xml
@Bean
JmsMessageEndpointManager jmsMessageEndpointManager(ResourceAdapter resourceAdapter,
MessageListener myMessageListener) {
ActiveMQActivationSpec spec = new ActiveMQActivationSpec();
spec.setDestination("myQueue");
spec.setDestinationType("jakarta.jms.Queue");
JmsMessageEndpointManager endpointManager = new JmsMessageEndpointManager();
endpointManager.setResourceAdapter(resourceAdapter);
endpointManager.setActivationSpec(spec);
endpointManager.setMessageListener(myMessageListener);
return endpointManager;
}
@Bean
fun jmsMessageEndpointManager(
resourceAdapter: ResourceAdapter, myMessageListener: MessageListener) = JmsMessageEndpointManager().apply {
setResourceAdapter(resourceAdapter)
activationSpec = ActiveMQActivationSpec().apply {
destination = "myQueue"
destinationType = "jakarta.jms.Queue"
}
messageListener = myMessageListener
}
<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>
有关详细信息,请参阅 JmsMessageEndpointManager、JmsActivationSpecConfig 和 ResourceAdapterFactoryBean 的 javadoc。
Spring 还提供了一个通用的 JCA 消息端点管理器,它不依赖于 JMS:org.springframework.jca.endpoint.GenericMessageEndpointManager
。该组件允许使用任何消息监听器类型(例如 JMS MessageListener
)和任何特定于提供者的 ActivationSpec
对象。请参阅您的 JCA 提供者的文档以了解连接器的实际功能,并参阅 GenericMessageEndpointManager javadoc 以获取 Spring 特定的配置详细信息。
基于 JCA 的消息端点管理与 EJB 2.1 消息驱动 Bean 非常相似。它使用相同的底层资源提供者契约。与 EJB 2.1 MDB 类似,你也可以在 Spring 上下文中使用 JCA 提供者支持的任何消息监听器接口。尽管如此,Spring 还是为 JMS 提供了明确的“便利”支持,因为 JMS 是与 JCA 端点管理契约一起使用的最常见的端点 API。