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

要為此監聽器啟動的並行 Session 或消費者數量。此值可以是表示最大數量的簡單數字(例如,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

將此元素定義的設定公開為具有指定 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

ErrorHandler 策略的參考,用於處理在 MessageListener 執行期間可能發生的任何未捕獲的例外。

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 感知池)。

acknowledge

原生 JMS 應答模式:autoclientdups-oktransacted。值 transacted 會啟動本地交易的 Session。或者,您可以指定 transaction-manager 屬性,稍後在表中描述。預設值為 auto

transaction-manager

對外部 PlatformTransactionManager 的參考(通常是基於 XA 的交易協調器,例如 Spring 的 JtaTransactionManager)。如果未指定,則使用原生應答(請參閱 acknowledge 屬性)。

concurrency

要為每個監聽器啟動的並行 Session 或消費者數量。它可以是表示最大數量的簡單數字(例如,5),也可以是表示下限和上限範圍的範圍(例如,3-5)。請注意,指定的最小值僅為提示,在執行階段可能會被忽略。預設值為 1。如果使用主題監聽器或佇列排序很重要,則應將並行性限制為 1。對於一般佇列,請考慮提高它。

prefetch

要載入到單個 Session 中的最大訊息數。請注意,提高此數字可能會導致並行消費者飢餓。

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

將此元素定義的設定公開為具有指定 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

要為每個監聽器啟動的並行 Session 或消費者數量。它可以是表示最大數量的簡單數字(例如 5),也可以是表示下限和上限範圍的範圍(例如,3-5)。請注意,指定的最小值僅為提示,當您使用 JCA 監聽器容器時,通常會被忽略。預設值為 1。

prefetch

要載入到單個 Session 中的最大訊息數。請注意,提高此數字可能會導致並行消費者飢餓。