JMS 命名空间支持

Spring 提供了一个 XML 命名空间,用于简化 JMS 配置。要使用 JMS 命名空间元素,你需要引用 JMS schema,示例如下

<?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">

	<!-- bean definitions here -->

</beans>
1 引用 JMS schema。

该命名空间包含三个顶级元素:<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>

前面的示例等同于创建两个独立的监听器容器 Bean 定义和两个独立的 MessageListenerAdapter Bean 定义,如使用 MessageListenerAdapter 中所示。除了前面示例中显示的属性之外,listener 元素还可以包含一些可选属性。下表描述了所有可用属性

表 1. JMS <listener> 元素的属性
属性 描述

id

托管监听器容器的 Bean 名称。如果未指定,则会自动生成一个 Bean 名称。

destination (必填)

此监听器的目标名称,通过 DestinationResolver 策略解析。

ref (必填)

处理程序对象的 Bean 名称。

method

要调用的处理程序方法名称。如果 ref 属性指向一个 MessageListener 或 Spring SessionAwareMessageListener,则可以省略此属性。

response-destination

发送响应消息的默认响应目标名称。当请求消息不包含 JMSReplyTo 字段时适用。此目标的类型由监听器容器的 response-destination-type 属性确定。请注意,这仅适用于具有返回值的监听器方法,其中每个结果对象都会被转换为响应消息。

subscription

持久订阅的名称(如果有)。

selector

此监听器的可选消息选择器。

concurrency

为此监听器启动的并发会话或消费者数量。此值可以是一个表示最大数量的简单数字(例如 5),也可以是一个表示下限和上限的范围(例如 3-5)。请注意,指定的最小值仅为提示,运行时可能会被忽略。默认值由容器提供。

<listener-container/> 元素也接受几个可选属性。这允许自定义各种策略(例如 taskExecutordestinationResolver)以及基本的 JMS 设置和资源引用。通过使用这些属性,你可以定义高度定制的监听器容器,同时仍然受益于命名空间的便利性。

通过 factory-id 属性指定要暴露的 Bean 的 id,你可以自动将这些设置暴露为 JmsListenerContainerFactory,以便它们可以被其他端点重用,示例如下

<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>

下表描述了所有可用属性。有关各个属性的更多详细信息,请参阅 AbstractMessageListenerContainer 及其具体子类的类级别 javadoc。javadoc 还讨论了事务选择和消息重发场景。

表 2. JMS <listener-container> 元素的属性
属性 描述

container-type

此监听器容器的类型。可用选项包括 defaultsimpledefault102simple102(默认选项是 default)。

container-class

自定义监听器容器实现类,使用完全限定类名。默认是 Spring 的标准 DefaultMessageListenerContainerSimpleMessageListenerContainer,取决于 container-type 属性。

factory-id

使用指定的 id 将此元素定义的设置暴露为 JmsListenerContainerFactory,以便它们可以被其他端点重用。

connection-factory

对 JMS ConnectionFactory Bean 的引用(默认 Bean 名称是 connectionFactory)。

task-executor

对 Spring TaskExecutor 的引用,用于 JMS 监听器调用者。

destination-resolver

DestinationResolver 策略的引用,用于解析 JMS Destination 实例。

message-converter

MessageConverter 策略的引用,用于将 JMS 消息转换为监听器方法参数。默认是 SimpleMessageConverter

error-handler

ErrorHandler 策略的引用,用于处理在执行 MessageListener 期间可能发生的任何未捕获异常。

destination-type

此监听器的 JMS 目标类型:queue(队列)、topic(主题)、durableTopic(持久主题)、sharedTopic(共享主题)或 sharedDurableTopic(共享持久主题)。这可能启用容器的 pubSubDomainsubscriptionDurablesubscriptionShared 属性。默认是 queue(这会禁用那三个属性)。

response-destination-type

响应的 JMS 目标类型:queuetopic。默认值是 destination-type 属性的值。

client-id

此监听器容器的 JMS 客户端 ID。使用持久订阅时必须指定它。

cache

JMS 资源的缓存级别:none(无)、connection(连接)、session(会话)、consumer(消费者)或 auto(自动)。默认情况下(auto),缓存级别实际上是 consumer,除非指定了外部事务管理器——在这种情况下,实际默认将是 none(假设是 Jakarta EE 风格的事务管理,其中给定的 ConnectionFactory 是一个支持 XA 的连接池)。

acknowledge

原生 JMS 确认模式:auto(自动)、client(客户端)、dups-ok(重复可接受)或 transacted(事务)。transacted 值会激活本地事务化的 Session。作为替代方案,你可以指定表后面描述的 transaction-manager 属性。默认是 auto

transaction-manager

对外部 PlatformTransactionManager 的引用(通常是基于 XA 的事务协调器,例如 Spring 的 JtaTransactionManager)。如果未指定,则使用原生确认(参阅 acknowledge 属性)。

concurrency

为每个监听器启动的并发会话或消费者数量。可以是一个表示最大数量的简单数字(例如 5),也可以是一个表示下限和上限的范围(例如 3-5)。请注意,指定的最小值仅是提示,运行时可能会被忽略。默认是 1。对于主题监听器或需要保证队列顺序的情况,应将并发数限制为 1。对于普通队列,可以考虑增加并发数。

prefetch

加载到单个会话中的最大消息数。请注意,增加此数字可能会导致并发消费者的资源匮乏。

receive-timeout

接收调用的超时时间(以毫秒为单位)。默认是 1000(一秒)。-1 表示没有超时。

back-off

指定用于计算恢复尝试间隔的 BackOff 实例。如果 BackOffExecution 实现返回 BackOffExecution#STOP,则监听器容器不会进一步尝试恢复。设置此属性时,将忽略 recovery-interval 的值。默认是一个间隔为 5000 毫秒(即五秒)的 FixedBackOff

recovery-interval

指定恢复尝试之间的间隔,以毫秒为单位。它提供了一种方便的方式来创建具有指定间隔的 FixedBackOff。对于更多的恢复选项,请考虑指定一个 BackOff 实例。默认是 5000 毫秒(即五秒)。

phase

此容器应在其生命周期内启动和停止的阶段。值越低,此容器启动得越早,停止得越晚。默认值是 Integer.MAX_VALUE,意味着容器启动得尽可能晚,停止得尽可能早。

使用 jms schema 支持配置基于 JCA 的监听器容器非常相似,示例如下

<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 变体的可用配置选项

表 3. JMS <jca-listener-container/> 元素的属性
属性 描述

factory-id

使用指定的 id 将此元素定义的设置暴露为 JmsListenerContainerFactory,以便它们可以被其他端点重用。

resource-adapter

对 JCA ResourceAdapter Bean 的引用(默认 Bean 名称是 resourceAdapter)。

activation-spec-factory

JmsActivationSpecFactory 的引用。默认是自动检测 JMS 提供者及其 ActivationSpec 类(参阅 DefaultJmsActivationSpecFactory)。

destination-resolver

DestinationResolver 策略的引用,用于解析 JMS Destinations

message-converter

MessageConverter 策略的引用,用于将 JMS 消息转换为监听器方法参数。默认是 SimpleMessageConverter

destination-type

此监听器的 JMS 目标类型:queue(队列)、topic(主题)、durableTopic(持久主题)、sharedTopic(共享主题)或 sharedDurableTopic(共享持久主题)。这可能启用容器的 pubSubDomainsubscriptionDurablesubscriptionShared 属性。默认是 queue(这会禁用那三个属性)。

response-destination-type

响应的 JMS 目标类型:queuetopic。默认值是 destination-type 属性的值。

client-id

此监听器容器的 JMS 客户端 ID。使用持久订阅时需要指定它。

acknowledge

原生 JMS 确认模式:autoclientdups-oktransactedtransacted 值会激活本地事务化的 Session。作为替代方案,你可以指定后面描述的 transaction-manager 属性。默认是 auto

transaction-manager

对 Spring JtaTransactionManagerjakarta.transaction.TransactionManager 的引用,用于为每条传入消息启动一个 XA 事务。如果未指定,则使用原生确认(参阅 acknowledge 属性)。

concurrency

为每个监听器启动的并发会话或消费者数量。可以是一个表示最大数量的简单数字(例如 5),也可以是一个表示下限和上限的范围(例如 3-5)。请注意,指定的最小值仅为提示,并且在使用 JCA 监听器容器时通常在运行时被忽略。默认是 1。

prefetch

加载到单个会话中的最大消息数。请注意,增加此数字可能会导致并发消费者的资源匮乏。