首页 > 解决方案 > 如何在 Spring Boot 中配置并发 rabbitmq 监听器?

问题描述

我已经设置了一个支持 RabbitMQ 的最小 Spring Boot 项目,我的使用者看起来像这样:

package app.mq.consumers;

import org.springframework.stereotype.Component;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import java.util.Date;

@Component
public final class StdoutConsumer {

  @RabbitListener(
    queues = {"stdout-q"},
    concurrency = "5",
    autoStartup = "true",
    exclusive = false
  )
  public void receiveMessage(Object message) throws Exception {
    Thread.sleep(1000);
    System.out.println(new Date());
  }
}

它只休眠 1 秒并在标准输出中打印一个时间戳。

这是application.yml

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

就这样。其他一切都完全不变。

我将 30 条消息推送到 RabbitMQ,然后启动 Spring Boot 应用程序,我希望看到大约同时打印 5 个时间戳(因为我将 设置concurrency"5"),1 秒后,接下来是 5 个时间戳,依此类推。但是,我看到的是时间戳是一个一个打印出来的,任何两个时间戳之间的间隔大约是 1 秒。如果我将代码更改为休眠 5 秒,则每 2 个时间戳之间的间隔变为 5 秒。

预填充的 RabbitMQ 队列

打印的时间戳

但是,当我第一次启动 Spring Boot 应用程序然后快速将消息推送到 MQ 时,5 个消费者确实同时工作。

即时填充队列

消费者同时工作

我猜这个问题来自消费者的初始化阶段,但是为什么 Spring 框架会一次性初始化消费者呢?我怎样才能让它们立即开始而不是一个一个开始?

标签: spring-bootrabbitmq

解决方案


推荐阅读