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 自動恢復,以避免在代理可用但連線尚未恢復時出現 AutoRecoverConnectionNotCurrentlyOpenException 例項。從 1.7.1 版本開始,Spring AMQP 預設停用此功能,除非您明確建立自己的 RabbitMQ 連線工廠並將其提供給 CachingConnectionFactory。由 RabbitConnectionFactoryBean 建立的 RabbitMQ ConnectionFactory 例項也預設停用該選項。

一般更改

ExchangeBuilder 現在預設構建持久交換機。在 @QueueBinding 中使用的 @Exchange 註解也預設宣告持久交換機。在 @RabbitListener 中使用的 @Queue 註解預設情況下,如果命名,則宣告持久佇列;如果匿名,則宣告非持久佇列。有關更多資訊,請參閱 佇列和交換機的 Builder API註解驅動的監聽器端點

已刪除的類

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

新的監聽器容器

DirectMessageListenerContainer 已與現有的 SimpleMessageListenerContainer 一起新增。有關如何選擇要使用的容器以及如何配置它們的資訊,請參閱 選擇容器訊息監聽器容器配置

Log4j Appender

由於 log4j 已停止維護,此 appender 不再可用。有關可用日誌 appender 的資訊,請參閱 日誌子系統 AMQP Appender

RabbitTemplate 更改

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

RabbitTemplate 現在(預設情況下)使用 DirectReplyToMessageListenerContainer,而不是為每個請求建立一個新消費者。有關更多資訊,請參閱 RabbitMQ 直接回復

AsyncRabbitTemplate 現在支援直接回復。有關更多資訊,請參閱 非同步 Rabbit 模板

RabbitTemplateAsyncRabbitTemplate 現在具有 receiveAndConvertconvertSendAndReceiveAsType 方法,它們接受 ParameterizedTypeReference<T> 引數,允許呼叫者指定將結果轉換為的型別。這對於複雜型別或訊息頭中未傳輸型別資訊的情況特別有用。它需要一個 SmartMessageConverter,例如 Jackson2JsonMessageConverter。有關更多資訊,請參閱 請求/回覆訊息非同步 Rabbit 模板使用 RabbitTemplateMessage 轉換使用 RabbitTemplateMessage 轉換

您現在可以使用 RabbitTemplate 在專用通道上執行多個操作。有關更多資訊,請參閱 作用域操作

監聽器介面卡

提供了一個方便的 FunctionalInterface,用於將 lambda 與 MessageListenerAdapter 一起使用。有關更多資訊,請參閱 MessageListenerAdapter

偵聽器容器的更改

預取預設值

預取預設值以前是 1,這可能導致高效消費者的利用率不足。現在預設預取值為 250,這在大多數常見場景中應能使消費者保持忙碌,從而提高吞吐量。

在某些情況下,預取值應較低——例如,對於大訊息,特別是當處理速度較慢時(訊息可能在客戶端程序中累積大量記憶體),以及當嚴格的訊息排序是必需時(在這種情況下,預取值應設定回 1)。此外,在訊息量較低且有多個消費者(包括單個監聽器容器例項內的併發)的情況下,您可能希望減少預取,以使訊息在消費者之間更均勻地分佈。

有關預取的更多背景資訊,請參閱關於 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 的類似元件。有關更多資訊,請參閱 Jackson2JsonMessageConverter

JSON 訊息轉換器

當入站 JSON 訊息的 TypeId 設定為 Hashtable 時,預設轉換型別現在是 LinkedHashMap。以前是 Hashtable。要恢復為 Hashtable,您可以在 DefaultClassMapper 上使用 setDefaultMapType

XML 解析器

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

阻塞連線

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

有關更多資訊,請參閱 連線和資源管理

© . This site is unofficial and not affiliated with VMware.