2.0 版本以來的變更與 1.7 版本之比較

使用 CachingConnectionFactory

從 2.0.2 版本開始,您可以設定 RabbitTemplate 使用與監聽器容器不同的連線。此變更避免了當生產者因任何原因而被封鎖時,消費者發生死鎖的情況。請參閱 使用獨立連線 以取得更多資訊。

AMQP 用戶端程式庫

Spring AMQP 現在使用 RabbitMQ 團隊提供的 amqp-client 程式庫的全新 5.0.x 版本。此用戶端預設已設定自動復原。請參閱 RabbitMQ 自動連線/拓撲復原

從 4.0 版本開始,用戶端預設啟用自動復原。雖然與此功能相容,但 Spring AMQP 有其自身的復原機制,通常不需要用戶端復原功能。我們建議您停用 amqp-client 自動復原,以避免在 Broker 可用但連線尚未復原時,收到 AutoRecoverConnectionNotCurrentlyOpenException 實例。從 1.7.1 版本開始,除非您明確建立自己的 RabbitMQ 連線工廠並將其提供給 CachingConnectionFactory,否則 Spring AMQP 會停用它。由 RabbitConnectionFactoryBean 建立的 RabbitMQ ConnectionFactory 實例也預設停用此選項。

一般變更

ExchangeBuilder 現在預設建置持久交換器。@QeueueBinding 中使用的 @Exchange 註解也預設宣告持久交換器。在 @RabbitListener 中使用的 @Queue 註解,如果已命名則預設宣告持久佇列,如果是匿名則宣告非持久佇列。請參閱 佇列和交換器的 Builder API註解驅動的監聽器端點 以取得更多資訊。

已刪除的類別

不再提供 UniquelyNameQueue。建立具有唯一名稱的持久非自動刪除佇列是不常見的。此類別已刪除。如果您需要其功能,請使用 new Queue(UUID.randomUUID().toString())

新的監聽器容器

已新增 DirectMessageListenerContainer,與現有的 SimpleMessageListenerContainer 並列。請參閱 選擇容器訊息監聽器容器組態,以取得關於選擇要使用的容器以及如何設定容器的資訊。

Log4j Appender

由於 log4j 已終止生命週期,因此不再提供此 appender。請參閱 記錄子系統 AMQP Appenders,以取得關於可用記錄 appender 的資訊。

RabbitTemplate 變更

先前,如果非交易式 RabbitTemplate 在交易式監聽器容器執行緒上執行,則會參與現有的交易。這是一個嚴重的錯誤。但是,使用者可能依賴此行為。從 1.6.2 版本開始,您必須在範本上設定 channelTransacted 布林值,才能使其參與容器交易。

RabbitTemplate 現在使用 DirectReplyToMessageListenerContainer(預設),而不是為每個請求建立新的消費者。請參閱 RabbitMQ Direct reply-to 以取得更多資訊。

AsyncRabbitTemplate 現在支援 direct reply-to。請參閱 Async Rabbit Template 以取得更多資訊。

RabbitTemplateAsyncRabbitTemplate 現在具有 receiveAndConvertconvertSendAndReceiveAsType 方法,這些方法接受 ParameterizedTypeReference<T> 引數,讓呼叫者指定要將結果轉換成的類型。這對於複雜類型或類型資訊未在訊息標頭中傳達時特別有用。這需要 SmartMessageConverter,例如 Jackson2JsonMessageConverter。請參閱 請求/回覆訊息傳遞Async Rabbit Template從具有 RabbitTemplateMessage 轉換[json-complex] 以取得更多資訊。

您現在可以使用 RabbitTemplate 在專用通道上執行多個操作。請參閱 Scoped Operations 以取得更多資訊。

Listener Adapter

方便的 FunctionalInterface 可用於將 lambda 與 MessageListenerAdapter 一起使用。請參閱 MessageListenerAdapter 以取得更多資訊。

監聽器容器變更

Prefetch 預設值

prefetch 預設值以前為 1,這可能會導致有效率的消費者未被充分利用。prefetch 預設值現在為 250,這應該可在大多數常見情況下讓消費者保持忙碌,從而提高輸送量。

在某些情況下,prefetch 值應該較低 — 例如,對於大型訊息,特別是當處理速度緩慢時(訊息可能會在用戶端程序中累積大量記憶體),並且如果嚴格的訊息排序是必要的(在這種情況下,prefetch 值應設定回 1)。此外,對於低容量訊息傳遞和多個消費者(包括單一監聽器容器實例中的並行),您可能希望減少 prefetch 以獲得更均勻的訊息在消費者之間的分配。

如需關於 prefetch 的更多背景資訊,請參閱這篇關於 RabbitMQ 中的消費者利用率 的文章,以及這篇關於 排隊理論 的文章。

訊息計數

先前,MessageProperties.getMessageCount() 為容器發出的訊息傳回 0。此屬性僅在您使用 basicGet 時適用(例如,從 RabbitTemplate.receive() 方法),現在針對容器訊息初始化為 null

交易回滾行為

無論是否設定交易管理器,交易回滾時的訊息重新排隊現在是一致的。請參閱 關於接收訊息回滾的注意事項 以取得更多資訊。

關閉行為

如果容器執行緒未在 shutdownTimeout 內回應關閉,則預設會強制關閉通道。請參閱 訊息監聽器容器組態 以取得更多資訊。

接收後訊息後處理器

如果 afterReceiveMessagePostProcessors 屬性中的 MessagePostProcessor 傳回 null,則會捨棄訊息(並在適當時確認)。

連線工廠變更

連線和通道監聽器介面現在提供一種機制,以取得關於例外狀況的資訊。請參閱 連線和通道監聽器發布是非同步的 — 如何偵測成功和失敗 以取得更多資訊。

現在提供新的 ConnectionNameStrategy,以從 AbstractConnectionFactory 填入目標 RabbitMQ 連線的應用程式特定識別。請參閱 連線與資源管理 以取得更多資訊。

重試變更

不再提供 MissingMessageIdAdvice。其功能現在已內建。請參閱 同步操作中的失敗與重試選項 以取得更多資訊。

匿名佇列命名

預設情況下,AnonymousQueues 現在使用預設的 Base64UrlNamingStrategy 而不是簡單的 UUID 字串來命名。請參閱 AnonymousQueue 以取得更多資訊。

@RabbitListener 變更

您現在可以在 @RabbitListener 註解中提供簡單的佇列宣告(僅繫結至預設交換器)。請參閱 註解驅動的監聽器端點 以取得更多資訊。

您現在可以設定 @RabbitListener 註解,以便將任何例外狀況傳回給傳送者。您也可以設定 RabbitListenerErrorHandler 來處理例外狀況。請參閱 處理例外狀況 以取得更多資訊。

當您使用 @QueueBinding 註解時,您現在可以將佇列與多個路由金鑰繫結。此外,@QueueBinding.exchange() 現在支援自訂交換器類型,並預設宣告持久交換器。

您現在可以在註解層級設定監聽器容器的 concurrency,而不必為不同的並行設定設定不同的容器工廠。

您現在可以在註解層級設定監聽器容器的 autoStartup 屬性,以覆寫容器工廠中的預設設定。

您現在可以在 RabbitListener 容器工廠中設定接收後和傳送前(回覆)MessagePostProcessor 實例。

請參閱 註解驅動的監聽器端點 以取得更多資訊。

從 2.0.3 版本開始,類別層級 @RabbitListener 上的其中一個 @RabbitHandler 註解可以指定為預設值。請參閱 多方法監聽器 以取得更多資訊。

容器條件式回滾

當使用外部交易管理器(例如 JDBC)時,當您為容器提供交易屬性時,現在支援基於規則的回滾。當您使用交易建議時,現在也更加靈活。請參閱 條件式回滾 以取得更多資訊。

移除 Jackson 1.x 支援

在先前版本中已棄用,Jackson 1.x 轉換器和相關元件現在已刪除。您可以使用基於 Jackson 2.x 的類似元件。請參閱 JSON 訊息轉換器 以取得更多資訊。

JSON 訊息轉換器

TypeId 設定為輸入 JSON 訊息的 Hashtable 時,預設轉換類型現在為 LinkedHashMap。先前,它是 Hashtable。若要還原為 Hashtable,您可以在 DefaultClassMapper 上使用 setDefaultMapType

XML Parsers

在剖析 QueueExchange XML 元件時,如果存在 id 屬性,剖析器不再將 name 屬性值註冊為 bean 別名。請參閱 關於 idname 屬性的注意事項 以取得更多資訊。

封鎖連線

您現在可以將 com.rabbitmq.client.BlockedListener 注入到 org.springframework.amqp.rabbit.connection.Connection 物件中。此外,當連線被 Broker 封鎖或解除封鎖時,ConnectionFactory 會發出 ConnectionBlockedEventConnectionUnblockedEvent 事件。

請參閱 連線與資源管理 以取得更多資訊。