RabbitMQ的消息確認機制

一:確認種類

RabbitMQ的消息確認有兩種。spring

一種是消息發送確認。這種是用來確認生產者將消息發送給交換器,交換器傳遞給隊列的過程當中,消息是否成功投遞。發送確認分爲兩步,一是確認是否到達交換器,二是確認是否到達隊列。spring-boot

第二種是消費接收確認。這種是確認消費者是否成功消費了隊列中的消息。spa

二:消息發送確認

(1)ConfirmCallbackcode

經過實現ConfirmCallBack接口,消息發送到交換器Exchange後觸發回調。blog

RabbitMQ的消息確認機制

 

使用該功能須要開啓確認,spring-boot中配置以下:接口

spring.rabbitmq.publisher-confirms = truerabbitmq

(2)ReturnCallback隊列

經過實現ReturnCallback接口,若是消息從交換器發送到對應隊列失敗時觸發(好比根據發送消息時指定的routingKey找不到隊列時會觸發)ip

RabbitMQ的消息確認機制

 

使用該功能須要開啓確認,spring-boot中配置以下:get

spring.rabbitmq.publisher-returns = true

三:消息接收確認

(1)確認模式

  • AcknowledgeMode.NONE:不確認
  • AcknowledgeMode.AUTO:自動確認
  • AcknowledgeMode.MANUAL:手動確認

spring-boot中配置方法:

spring.rabbitmq.listener.simple.acknowledge-mode = manual

(2)手動確認

RabbitMQ的消息確認機制

未確認的消息數

上圖爲channel中未被消費者確認的消息數。

經過RabbitMQ的host地址加上默認端口號15672訪問管理界面。

(2.1)成功確認

void basicAck(long deliveryTag, boolean multiple) throws IOException;

deliveryTag:該消息的index

multiple:是否批量. true:將一次性ack全部小於deliveryTag的消息。

消費者成功處理後,調用channel.basicAck(message.getMessageProperties().getDeliveryTag(), false)方法對消息進行確認。

(2.2)失敗確認

void basicNack(long deliveryTag, boolean multiple, boolean requeue)

throws IOException;

deliveryTag:該消息的index。

multiple:是否批量. true:將一次性拒絕全部小於deliveryTag的消息。

requeue:被拒絕的是否從新入隊列。

 

void basicReject(long deliveryTag, boolean requeue) throws IOException;

deliveryTag:該消息的index。

requeue:被拒絕的是否從新入隊列。

channel.basicNack 與 channel.basicReject 的區別在於basicNack能夠批量拒絕多條消息,而basicReject一次只能拒絕一條消息。

 

(2.3)消息拒絕後,再次發佈消息

channel.basicPublish(message.getMessageProperties().getReceivedExchange(),
                    message.getMessageProperties().getReceivedRoutingKey(), 
                    MessageProperties.PERSISTENT_TEXT_PLAIN,
                    message.getBody());
相關文章
相關標籤/搜索