1. 程式人生 > >Spring AMQP 源碼分析 06 - 手動消息確認

Spring AMQP 源碼分析 06 - 手動消息確認

方法 message href sage str remes 分享 bit release

### 準備

## 目標

了解 Spring AMQP 如何手動確認消息已成功消費

## 前置知識

《Spring AMQP 源碼分析 04 - MessageListener

## 相關資源

Offical doc:<http://docs.spring.io/spring-amqp/docs/1.7.3.RELEASE/reference/html/_reference.html#message-listener-adapter> Sample code:<https://github.com/gordonklg/study>,rabbitmq module 源碼版本:Spring AMQP 1.7.3.RELEASE

## 測試代碼

gordon.study.rabbitmq.springamqp.AsyncConsumerManualAck.java 技術分享

### 分析

## 手動消息確認的實現

對於手動消息確認模式(AcknowledgeMode.MANUAL),Spring AMQP 選擇讓開發者在消息處理邏輯中自己調用 RabbitMQ java client 的 basicAck 方法確認消息。 MessageListener 接口無法滿足要求,因為 onMessage 回調方法無法獲取 Channel 對象。 Spring AMQP 提供了 ChannelAware
MessageListener 接口,其 onMessage 回調方法包含 Channel 參數,可用於手動確認消息。 示例代碼第25行將 SimpleMessageListenerContainer 的消息確認模式設為 MANUAL,第28行實現 ChannelAwareMessageListener 接口,在 onMessage 回調函數中消費消息,並在第33行調用 basicAck 方法確認消息。 調用棧與前篇極為相似: 技術分享

## 消息轉化?

在使用 MessageListener 接口或 ChannelAwareMessageListener 接口時,框架沒有做過任何消息轉化。
示例代碼創建了一用就會出錯的 ScornMessageConverter,將之設置給 SimpleMessageListenerContainer。從程序打印可見,ScornMessageConverter 從未被使用。 這也是顯而易見的,畢竟 onMessage 回調方法接受的參數是 Message 類型,根本不需要轉化。

Spring AMQP 源碼分析 06 - 手動消息確認