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())
。
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 以取得更多資訊。
RabbitTemplate
和 AsyncRabbitTemplate
現在具有 receiveAndConvert
和 convertSendAndReceiveAsType
方法,這些方法接受 ParameterizedTypeReference<T>
引數,讓呼叫者指定要將結果轉換成的類型。這對於複雜類型或類型資訊未在訊息標頭中傳達時特別有用。這需要 SmartMessageConverter
,例如 Jackson2JsonMessageConverter
。請參閱 請求/回覆訊息傳遞、Async Rabbit Template、從具有 RabbitTemplate
的 Message
轉換 和 [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
內回應關閉,則預設會強制關閉通道。請參閱 訊息監聽器容器組態 以取得更多資訊。
連線工廠變更
連線和通道監聽器介面現在提供一種機制,以取得關於例外狀況的資訊。請參閱 連線和通道監聽器 和 發布是非同步的 — 如何偵測成功和失敗 以取得更多資訊。
現在提供新的 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
在剖析 Queue
和 Exchange
XML 元件時,如果存在 id
屬性,剖析器不再將 name
屬性值註冊為 bean 別名。請參閱 關於 id
和 name
屬性的注意事項 以取得更多資訊。
封鎖連線
您現在可以將 com.rabbitmq.client.BlockedListener
注入到 org.springframework.amqp.rabbit.connection.Connection
物件中。此外,當連線被 Broker 封鎖或解除封鎖時,ConnectionFactory
會發出 ConnectionBlockedEvent
和 ConnectionUnblockedEvent
事件。
請參閱 連線與資源管理 以取得更多資訊。