RabbitMQ------ACK确认机制

一。介绍

1.消费者从RabbitMQ收到消息并处理完成后,反馈给RabbitMQ,RabbitMQ收到反馈后才将此消息从队列中删除
2.消费者在处理消息出现了网络不稳定、服务器异常等现象,那么就不会有ACK反馈,RabbitMQ会认为这个消息没有正常消费,会将消息重新放入队列中
3.只有当消费者正确发送ACK反馈,RabbitMQ确认收到后,消息才会从RabbitMQ服务器的数据中删除。
4.消息的ACK确认机制默认是打开的,消息如未被进行ACK的消息确认机制,这条消息被锁定Unacked

 

二。确认方式

1.自动确认(默认)

2.手动确认 manual

spring:
  rabbitmq:
    #开启手动确认消息
    listener:
      simple:
        acknowledge-mode: manual

3.两种方式区别

转载:

非常好理解的推文

https://www.cnblogs.com/refuge/p/10356750.html

 

三。deliveryTag介绍

表示消息投递序号,每次消费消息或者消息重新投递后, deliveryTag都会增加

 

四。basicNack和basicReject介绍

1.basicReject一次只能拒绝接收一个消息,可以设置是否requeue。
2.basicNack方法可以支持一次0个或多个消息的拒收,可以设置是否requeue。

用处举例:

人工审核异常消息:
设置重试阈值,超过后确认消费成功,记录消息,人工处理

代码:

部分代码可参考:

https://www.cnblogs.com/tianhengblogs/p/15341670.html

https://www.cnblogs.com/tianhengblogs/p/15342226.html

复制代码
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
@RabbitListener(queues = "order_queue")
public class OrderMQListener {

    /**
     * body: 接收onvertAndSend(String exchange, String routingKey, Object object)的order消息
     *
     * */
    @RabbitHandler
    public void messageHandler(String body, Message message, Channel channel) throws IOException {

        long msgTag = message.getMessageProperties().getDeliveryTag();
        System.out.println("body: " + body);
        System.out.println("msgTag: " + msgTag);
        System.out.println("message: " + message.toString());

        //告诉broker(消息队列服务器实体),消息已经被确认
        channel.basicAck(msgTag, false);
        //告诉broker,消息拒绝确认(可以拒绝多条,把比当前msgTag值小的也拒绝)
//        channel.basicNack(msgTag, false, true);
        //告诉broker,消息拒绝确认(只能拒绝当前msgTag的这条)
//        channel.basicReject(msgTag, true);
    }
}
View Code
复制代码

 

posted @   玉天恒  阅读(1257)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示