rabbitMq集成Spring後,消費者設置手動ack,並且在業務上控制是否ack

1. 在這裏不提如何集成rabbit mq到Spring。

2. 實現功能的配置都在消費者端:

3. 下面是步驟和說明

(1)在消費者端的mq配置文件上添加,配置  關鍵代碼爲 acknowledeg = "manual"
,意爲表示該消費者的ack方式爲手動(此時的queue已經和生產者的exchange通過某個routeKey綁定了)

[html]  view plain  copy
  1. <rabbit:listener-container connection-factory="connectionFactory" acknowledge="manual">  
  2.     <rabbit:listener queues="queue_xxx" ref="MqConsumer"/>  
  3.     <rabbit:listener queues="queue_xxx" ref="MqConsumer2"/>  
  4. </rabbit:listener-container>  

(2)新建一個類 MqConsumer ,並實現接口  ChannelAwareMessageListener ,實現onMessage方法,不需要指定方法。

因爲下方圖所示,springAMQP中已經實現了一個功能,如果該監聽器已經實現了下面2個接口,則直接調用onMessage方法


(3)關鍵點在實現了ChannelAwareMessageListener的onMessage方法後,會有2個參數。

一個是message(消息實體),一個是channel就是當前的通道

很多地方都沒有說清楚怎麼去手動ack,其實手動ack就是在當前channel裏面調用basicAsk的方法,並傳入當前消息的tagId就可以了。


其中deliveryTag是tag的id,由生產者生成。

第二個參數我其實也沒理解用途,暫時還沒有模擬出場景,所以先不討論。

同樣的,如果要unack或者拒絕消息(reject)的時候,也是調用channel裏面的basicXXX方法就可以了(當然要制定tagId)。

注意如果拋異常或unack(並且requeue爲true),消息會一直重新入隊列,一不小心就會xxxxx一大堆消息不斷重複~。


//消息的標識,false只確認當前一個消息收到,true確認所有consumer獲得的消息

channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);

//ack返回false,並重新回到隊列,api裏面解釋得很清楚

channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);

//拒絕消息

channel.basicReject(message.getMessageProperties().getDeliveryTag(), true);


暫時講完,如果有什麼補充或糾正歡迎大家指出