1. 在這裏不提如何集成rabbit mq到Spring。
2. 實現功能的配置都在消費者端:
3. 下面是步驟和說明
(1)在消費者端的mq配置文件上添加,配置 關鍵代碼爲 acknowledeg = "manual"
,意爲表示該消費者的ack方式爲手動(此時的queue已經和生產者的exchange通過某個routeKey綁定了)
(2)新建一個類 MqConsumer ,並實現接口 ChannelAwareMessageListener ,實現onMessage方法,不需要指定方法。
因爲下方圖所示,springAMQP中已經實現了一個功能,如果該監聽器已經實現了下面2個接口,則直接調用onMessage方法
(3)關鍵點在實現了ChannelAwareMessageListener的onMessage方法後,會有2個參數。
一個是message(消息實體),一個是channel就是當前的通道
很多地方都沒有說清楚怎麼去手動ack,其實手動ack就是在當前channel裏面調用basicAsk的方法,並傳入當前消息的tagId就可以了。
第二個參數我其實也沒理解用途,暫時還沒有模擬出場景,所以先不討論。
同樣的,如果要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);