【问题标题】:spring rabbitmq - consume multiple messages at the same timespring rabbitmq - 同时消费多条消息
【发布时间】:2020-12-29 18:40:37
【问题描述】:

我以这种方式在我的 Spring Boot 应用程序中使用 RabbitMQ

发件人:

rabbitTemplate.convertAndSend("exchange", "routingKey", "Message Text");

听众:

@RabbitListener(queues = "queueName")
public void receive(String message) {
    System.out.println("start");  
    //send an http request that takes for example 4 seconds 
    System.out.println("end");  
}

通过上述代码,当应用程序执行发送方部分时,receive 方法被调用。我的问题是receive 方法正在处理一条消息时,如果发件人部分将另一条消息放入队列中,该方法不会处理新消息,所以第二个start 字直到end 才会打印上一条消息的单词。换句话说,我想知道一个消息监听器如何一次处理多条消息我不知道是什么问题。

【问题讨论】:

    标签: java spring-boot rabbitmq spring-amqp spring-rabbit


    【解决方案1】:

    从您所说的问题来看,您的侦听器似乎配置为单线程。请参阅容器侦听器配置文档herehere,尤其是并发设置。并发设置控制有多少线程同时处理队列中的消息。

    【讨论】:

    • 感谢您的回答。我找到了setConcurrentConsumers() 方法。但是该方法会创建静态数量的线程。有没有办法动态地做到这一点?我的意思是,spring 处理它并按需添加一个线程
    • @hamed 您应该静态处理它。默认情况下,您的 JVM 只启动这么多可用线程。当您进入并发领域时,您开始必须了解这些与 JVM 相关的组件。
    • 您可以提供“maxConcurrentConsumers”来提供上限,并且侦听器容器根据负载动态调整线程数。您还可以选择提供自己的执行人。文档很好地解释了动态增加/减少消费者的算法。但是,您必须牢记消费者可用的处理能力以及消费者正在做的工作类型 - CPU 限制或 IO 限制。通常,如果您的工作负载受 IO 限制,您可以提供比 CPU 数量更多的线程。无限制的消费者数量无论如何都不是一个好主意。
    【解决方案2】:

    如果您使用的是spring boot,只需将此配置添加到应用程序属性中:

    # Minimum number of listener invoker threads
    spring.rabbitmq.listener.simple.concurrency=5
    

    您的侦听器将开始并行接受消息(多线程)。您还可以检查其他配置。就像侦听器调用线程的最大数量(查看 spring boot 文档以获取更多信息)。

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      相关资源
      最近更新 更多