首页 > 解决方案 > rabbit mq 中的队列长时间处于空闲状态

问题描述

在 rabbitmq 服务中,我配置了 8 个队列,我使用 spring 客户端向 rabbit MQ 发送消息,我可以将消息发送到各个队列,但大多数时候只有一个队列在运行,其余队列处于空闲状态,为了让所有队列轮流我已将配置的预取计数减少到 20,因此所有消息都不会发送到工作人员(消费者)并导致其他队列保持空闲,尽管如此我不这样做'没有看到并行运行的多个队列。

下面是我用来设置预取计数的弹簧配置

@Bean 
public CachingConnectionFactory rabbitConnectionFactory() throws Exception 
{
    com.rabbitmq.client.ConnectionFactory factory = new com.rabbitmq.client.ConnectionFactory(); 
    factory.setHost(host);
    factory.setUsername(username); 
    factory.setPassword(password);
    factory.setPort(5671);
    factory.useSslProtocol(); 
    CachingConnectionFactory connectionFactory = new CachingConnectionFactory(factory);
    return connectionFactory; 
}

我对每个队列都有不同的多个容器工厂,其中一些在下面提到。(不确定我们为什么使用工厂,我的假设是给队列提供预取等配置)

    @Bean(name = "ordersimplecontainer") 
        public SimpleRabbitListenerContainerFactory simpleOrderListenerContainerFactory()  throws Exception
        {
            SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
            factory.setConnectionFactory(rabbitConnectionFactory());
            factory.setMessageConverter(new Jackson2JsonMessageConverter());
            factory.setConcurrentConsumers(6); 
            factory.setMaxConcurrentConsumers(8);
            factory.setPrefetchCount(20);
            return factory; 
        }
@Bean(name = "productsimplecontainer") 
    public SimpleRabbitListenerContainerFactory simpleProductListenerContainerFactory() throws Exception
    { 
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(rabbitConnectionFactory());
        factory.setMessageConverter(new Jackson2JsonMessageConverter());
        factory.setConcurrentConsumers(3); 
        factory.setMaxConcurrentConsumers(4);
        factory.setPrefetchCount(20);
        return factory; 
    }

在侦听器代码中,我正在传递相应的连接工厂,如下所示

@RabbitListener( queues = "<queueName>", containerFactory = "<factoryName>", autoStartup = "${autocreateworker}")
    public void myListener(SftpStockDailySyncAsyncRequest sftpStockDailySyncRequest) {
    }

我遇到的问题是在任何给定时间只有一个队列正在运行,而其他队列处于空闲状态,并且由于这个重要的队列正在等待它们有机会进入运行状态,下面的屏幕描述了该场景。

在此处输入图像描述

请纠正我如何解决此问题。

截至目前,我有两台工作机器正在监听 RabbitMQ 服务器。

标签: javarabbitmqspring-amqp

解决方案


推荐阅读