JMS命名空间支持

Spring提供了一个用于简化JMS配置的XML命名空间。要使用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">

	<!-- bean definitions here -->

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

上述示例等同于创建两个不同的监听器容器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 元素的属性
属性 描述

container-type

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

container-class

作为完全限定类名的自定义监听器容器实现类。默认为Spring的标准 DefaultMessageListenerContainerSimpleMessageListenerContainer,根据 container-type 属性而定。

factory-id

将此元素定义的设置公开为具有指定 idJmsListenerContainerFactory,以便可以在其他端点中重用它们。

connection-factory

对 JMS ConnectionFactory bean 的引用(默认 bean 名称为 connectionFactory)。

task-executor

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

destination-resolver

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

message-converter

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

error-handler

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

destination-type

此监听器的 JMS 目标类型: queuetopicdurableTopicsharedTopicsharedDurableTopic。这可能启用容器的 pubSubDomainsubscriptionDurablesubscriptionShared 属性。默认为 queue(禁用这三个属性)。

response-destination-type

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

client-id

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

cache

JMS 资源的缓存级别: noneconnectionsessionconsumerauto。默认情况下(auto),缓存级别实际上是 consumer,除非已指定外部事务管理器,此时有效默认值将为 none(假设使用 Jakarta EE 风格的事务管理,给定的 ConnectionFactory 是 XA-aware 池)。

acknowledge

本机 JMS 确认模式: autoclientdups-oktransacted。值为 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 模式支持的基于 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

将此元素定义的设置公开为具有指定 idJmsListenerContainerFactory,以便它们可以在其他端点中重用。

resource-adapter

引用 JCA ResourceAdapter bean(默认 bean 名称为 resourceAdapter)。

activation-spec-factory

引用 JmsActivationSpecFactory。默认情况下,自动检测 JMS 提供程序及其 ActivationSpec 类(请参阅 DefaultJmsActivationSpecFactory)。

destination-resolver

引用用于解析 JMS DestinationsDestinationResolver 策略。

message-converter

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

destination-type

此监听器的 JMS 目标类型:queuetopicdurableTopicsharedTopicsharedDurableTopic。这可能启用容器的 pubSubDomainsubscriptionDurablesubscriptionShared 属性。默认为 queue(禁用这三个属性)。

response-destination-type

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

client-id

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

acknowledge

本机 JMS 确认模式:autoclientdups-oktransacted。值为 transacted 会激活本地事务的 Session。作为替代,您可以指定稍后描述的 transaction-manager 属性。默认为 auto

transaction-manager

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

concurrency

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

prefetch

加载到单个会话中的最大消息数。请注意,提高此数字可能导致并发消费者饥饿。