RabbitMQ消费端之消息确认及消息预取详解

阅读本文之前,请先查看基础安装及操作:RabbitMQ 基本api使用 以及和spring、springboot整合

1. 消费者如何确认消费?

为什么要确认消费? 默认情况下 消费者在拿到rabbitmq的消息时 已经自动确认这条消息已经消费了, 讲白话就是rabbitmq的队列里就会删除这条消息了, 但是 我们实际开发中 难免会遇到这种情况, 比如说 拿到这条消息 发现我处理不了 比如说 参数不对, 又比如说 我当前这个系统出问题了, 暂时不能处理这个消息, 但是 这个消息已经被你消费掉了 rabbitmq的队列里也删除掉了, 你自己这边又处理不了, 那么 ,这个消息就被遗弃了。 这种情况在实际开发中是不合理的, rabbitmq提供了解决这个问题的方案, 也就是我们上面所说的confirm模式 只是我们刚刚讲的是发送方的 这次我们来讲消费方的。

首先 我们在消费者这边设置一下消息确认为手动确认。当然 我们要对我们的消费者监听器进行一定的配置的话, 我们需要先实例一个监听器的Container 也就是容器, 那么我们的监听器(一个消费者里面可以实例多个监听器) 可以指定这个容器 那么我们只需要对这个Container(容器) 进行配置就可以了。
首先得声明一个容器并且在容器里面指定消息确认为手动确认:

@Bean
public SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(ConnectionFactory connectionFactory){
   
    SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory =
            new SimpleRabbitListenerContainerFactory();
    //这个connectionFactory就是我们自己配置的连接工厂直接注入进来
    simpleRabbitListenerContainerFactory.setConnectionFactory(connectionFactory);
    //这边设置消息确认方式由自动确认变为手动确认
    simpleRabbitListenerContainerFactory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
    return simpleRabbitListenerContainerFactory;
}

在这里插入图片描述

AcknowledgeMode关于这个类 就是一个简单的枚举类 一共3个状态: 不确认、手动确认和自动确认 如果是手动确认, 那么我们在处理完这条消息之后 得使这条消息确认:

@Component
public class TestListener  {
   
    //containerFactory:指定我们刚刚配置的容器
 @RabbitListener(queues = "testQueue",containerFactory = "simpleRabbitListenerContainerFactory")
    public void 
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RabbitMQ 中,消费者可以通过创建一个消息监听器来监听指定的队列,并在接收到消息后进行消息确认(ACK)。 下面是一个示例代码,展示了如何使用 RabbitMQ Java 客户库来实现消息监听和消息确认: ```java import com.rabbitmq.client.*; public class Consumer { private final static String QUEUE_NAME = "myQueue"; public static void main(String[] argv) throws Exception { // 创建连接工厂,并设置 RabbitMQ 服务器的连接信息 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); factory.setUsername("your_username"); factory.setPassword("your_password"); // 创建连接 Connection connection = factory.newConnection(); // 创建消息信道 Channel channel = connection.createChannel(); // 声明队列 channel.queueDeclare(QUEUE_NAME, false, false, false, null); // 创建消费者并设置消息处理逻辑 DefaultConsumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "UTF-8"); System.out.println("Received message: " + message); // 处理消息逻辑 // 手动发送消息确认 channel.basicAck(envelope.getDeliveryTag(), false); } }; // 设置消息确认模式为手动确认 channel.basicConsume(QUEUE_NAME, false, consumer); // 等待消息 while (true) { Thread.sleep(1000); } } } ``` 在上述代码中,首先创建了一个连接工厂,并设置 RabbitMQ 服务器的连接信息。然后创建连接和消息信道,声明了要消费队列。 接着创建了一个继承自 DefaultConsumer 的消费者对象,并重写了 handleDelivery 方法来处理接收到的消息。在处理消息的逻辑之后,使用 `channel.basicAck(envelope.getDeliveryTag(), false)` 手动发送消息确认。 最后,通过调用 `channel.basicConsume(QUEUE_NAME, false, consumer)` 来设置消费者消息确认模式为手动确认,并开始等待消息的到来。 请根据你的实际需求进行相应的修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值