RabbitMQ 高级特性——消息确认

RabbitMQ 高级特性——消息确认_第1张图片

文章目录

  • 前言
  • 消息确认机制
  • SpringBoot 实现消息确认
    • NONE
    • AUTO
    • MANUAL

前言

前面我们学习了 SpringBoot 整合 RabbitMQ,并且使用 RabbitMQ 实现了几种工作模式,接下来我们将学习关于 RabbitMQ 的高级特性——消息确认机制,持久化和发送方确认。

消息确认机制

大家应该学习过了计算机网络吧,那么 TCP 连接大家也一定不陌生吧,TCP 三次握手的时候,当服务器接收到建立连接的请求的时候,服务器就会返回一个 ACK 数据包,来告诉客户端我收到了你发送的请求。前面我们讲了一种确认机制,publisher/confirm 发布确认模式,那么这种模式是针对 RabbitMQ Broker 响应生产者发送的消息,而消费者消费消息的时候,也是需要告诉我们的队列是否接收到了这个消息的,以便队列能够选择删除这条消息还是重发这条消息。

对于消费者的消息确认有两种方式——自动确认和手动确认。

  1. 自动确认:当 autoAck 等于 true 的时候,RabbitMQ 会自动把发送出去的消息置为确认,让后从内存(或者磁盘)中删除,而不会管消费者是否正确的处理完成这条消息,自动确认适用于对于消息可靠性要求不高的场景。
  2. 手动确认:当 autoAck 等于 false 时,RabbitMQ 会等待消费者显式的调用 Basic.Ack 命令,回复确认后才从内存(或者磁盘)中移去消息。这种模式适用于对消息可靠性要求比较高的场景。

自动确认:

public class Constants {
   
    public static final String CONFIRM_QUEUE= "confirm.queue";
}

生产者代码:

public class ConfirmProducer {
   
    public static void main(String[] args) throws IOException, TimeoutException {
   
        //建立连接
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("123.57.1.114");
        factory.setPort(5672);
        factory.setVirtualHost("test");
        factory.setUsername("admin");
        factory.setPassword("admin");

        Connection connection = factory.newConnection();
        //开启信道
        Channel channel = connection.createChannel();
        //声明队列
        channel.queueDeclare(Constants.CONFIRM_QUEUE,true,false,false,null);
        //发送消息
        String msg = "rabbitmq confirm";
        channel.basicPublish("",Constants.CONFIRM_QUEUE,null,msg.getBytes());
        System.out.println("消息发送成功");
        channel.close();
        connection.close();
    }
}

消费者代码:

public class Consumer1 {
   
    public static void main(String[] args) throws IOException, TimeoutException {
   
        //建立连接
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost(

你可能感兴趣的:(RabbitMQ,rabbitmq,分布式)