SpringBoot集成RabbitMq中channel.basicQos()无效

当我使用如下代码时,发现我设置的预取值无效

@RabbitListener(queues = "test", ackMode = "MANUAL", concurrency = "3")
public void receiveMessage1(String message,
                            Channel channel,
                            @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag 
) throws IOException {
    channel.basicQos(6); //这里
    String res = "";
    try {
        Integer max = Integer.parseInt(message);
        res = TestFun.test1(max);
        channel.basicAck(deliveryTag, false);
    } catch (Exception e) {
        res = "error";
        channel.basicNack(deliveryTag, false, true);
        throw new RuntimeException(e);
    } finally {
        System.out.println("Received message: " + message);
    }

}

如下图所示,明明Rabbit管理界面显示的Prefetch是6,可是未确认消息却远高于这个值
无效

解决方法

放弃使用 channel.basicQos(6) 方法
使用SpringBoot的配置文件 application.yml

spring:
  rabbitmq:
    host:  # RabbitMQ地址
    port:  # RabbitMQ端口
    username:  # RabbitMQ用户名
    password:  # RabbitMQ密码
    listener:
      simple:
        prefetch: 6 # 在这里配置预取值

成功解决
解决

总结

不知道这个bug是我的问题还是,SpringBoot整合RabbitMQ的问题,有大佬告知一下吗

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
channel.basicQos方法用于设置消费者在处理多个消息时的预取数量(Prefetch Count)。预取数量指的是消费者在处理完一定数量的消息后,会向RabbitMQ服务器发送一个确认消息(ACK),告知服务器可以继续向消费者发送更多的消息。如果预取数量设置的较小,消费者需要更频繁地向服务器发送确认消息,会降低消息处理的效率;如果预取数量设置的较大,消费者可能会一次性处理过多的消息,导致内存占用过高。 在Springboot,我们可以通过RabbitListenerContainerFactory来配置消费者的预取数量。具体步骤如下: 1. 定义一个RabbitListenerContainerFactory的Bean,可以使用SimpleRabbitListenerContainerFactory或DirectRabbitListenerContainerFactory等实现类,根据需要配置相关属性。 ``` @Bean public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setPrefetchCount(10); // 设置预取数量为10 factory.setConcurrentConsumers(5); // 设置并发消费者数量为5 factory.setMaxConcurrentConsumers(10); // 设置最大并发消费者数量为10 return factory; } ``` 2. 在消费者方法上使用@RabbitListener注解,并指定containerFactory属性为上一步定义的Bean名称。 ``` @RabbitListener(queues = "test.queue", containerFactory = "rabbitListenerContainerFactory") public void consumeMessage(Message message) { // 消费消息的逻辑 } ``` 通过以上步骤,我们就可以在Springboot配置消费者的预取数量,提高消息处理的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值