Почему RabbitMQ использует только одного потребителя при запуске приложения?

#java #spring #rabbitmq

Вопрос:

Вот моя конфигурация RabbitMQ

 @Configuration
public class RabbitConfig {

    @Bean
    public CachingConnectionFactory connectionFactory() {
        return new CachingConnectionFactory("localhost");
    }

    @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory());
        factory.setConcurrentConsumers(4);
        factory.setMaxConcurrentConsumers(4);
        return factory;
    }

    @Bean
    public RabbitTemplate rabbitTemplate() {
        return new RabbitTemplate(connectionFactory());
    }

}
 

Вот слушатель

 @Component
public class Listener {

    @RabbitListener(queues = "FirstQueue")
    public void processFirstQueue(String message) {
        System.out.println("FIRST-QUEUE "   message);
    }

    @RabbitListener(queues = "SecondQueue", concurrency = "4-4")
    public void processSecondQueue(String message, Channel channel) {
        System.out.println("SECOND-QUEUE "   message   " "   Thread.currentThread().getName());
    }

}
 

Вот подробная информация о очереди

введите сюда описание изображения

И там есть бревна

 2021-06-22 12:55:45.811  INFO 1620 --- [           main] com.rabbit.demo.RabbitDemoApplication    : No active profile set, falling back to default profiles: default
2021-06-22 12:55:46.594  INFO 1620 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2021-06-22 12:55:46.616  INFO 1620 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2021-06-22 12:55:46.617  INFO 1620 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.39]
2021-06-22 12:55:46.753  INFO 1620 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2021-06-22 12:55:46.753  INFO 1620 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 882 ms
2021-06-22 12:55:46.951  INFO 1620 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2021-06-22 12:55:47.166  INFO 1620 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2021-06-22 12:55:47.168  INFO 1620 --- [           main] o.s.a.r.c.CachingConnectionFactory       : Attempting to connect to: localhost:5672
2021-06-22 12:55:47.196  INFO 1620 --- [           main] o.s.a.r.c.CachingConnectionFactory       : Created new connection: connectionFactory#4b6d92e:0/SimpleConnection@11d045b4 [delegate=amqp://guest@127.0.0.1:5672/, localPort= 57952]
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
2021-06-22 12:55:47.239  INFO 1620 --- [           main] com.rabbit.demo.RabbitDemoApplication    : Started RabbitDemoApplication in 1.676 seconds (JVM running for 2.381)
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
THERE IS RUNTIME SENDING STARTS
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-1
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-2
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-4
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-1
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-2
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-4
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-1
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-2
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-4
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-1
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-2
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-4
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-1
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-2
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-4
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-3
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-1
SECOND-QUEUE Hi org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-2
 

Все сообщения перед заголовком «НАЧИНАЕТСЯ ОТПРАВКА ВО ВРЕМЯ ВЫПОЛНЕНИЯ» были помещены в очередь во время остановки приложения. Сообщения после этого заголовка помещались в очередь во время работы приложения.
Я не понимаю, почему для обработки всех сообщений, которые были помещены в очередь до запуска приложения, использовался только один поток? Как я могу это исправить?

Комментарии:

1. Есть 4 потока. Возможно, вы не можете отправить сообщение одновременно.

2. Вы можете видеть, что только RabbitListenerEndpointContainer#1-3 работает с сообщениями, которые были помещены в очередь во время остановки приложения. Другие темы запускаются, когда я отправляю сообщения во время работы приложения. Я отправляю сообщения через пользовательский интерфейс управления кроликами

3. Поздороваться слишком быстро для многопоточной среды. На самом деле, если вы поместили какой-то поток в спящий режим, проверьте его. Вы можете остановить приложение и начать с режима сна потока.