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

載入到單個會話中的最大訊息數。請注意,增加此數字可能會導致併發消費者的資源匱乏。