为什么spring-amqp的消费者表现很慢?

时间:2013-09-11 03:22:11

标签: rabbitmq spring-amqp

我同时启动了生产者和消费者。 6小时后,生产者将大约6亿条消息发送到队列中并在6小时后停止生产者,但消费者正在连续运行,即使在运行18小时后仍然有4条消息正在排队。有没有人可以告诉我为什么消费者表现很慢?

提前致谢!

@Bean
    public SimpleMessageListenerContainer listenerContainer() {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory());
        container.setQueueNames(this.queueName);
        container.setMessageListener(new MessageListenerAdapter(new TestMessageHandler(), new JsonMessageConverter()));
        return container;
    }
@Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory(
                "localhost");
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        return connectionFactory;
    }

    @Bean
    public RabbitTemplate rabbitTemplate() {
        RabbitTemplate template = new RabbitTemplate(connectionFactory());
        template.setMessageConverter(new JsonMessageConverter());
        template.setRoutingKey(this.queueName);
        template.setQueue(this.queueName);
        return template;
    }

    public class TestMessageHandler  {
           // receive messages
        public void handleMessage(MessageBeanTest msgBean) {
                   //  Storing bean data into CSV file
             }
    }

2 个答案:

答案 0 :(得分:2)

根据WikiPedia,crore == 10,000,000所以你的意思是6000万。

容器只能像收听者那样快速处理邮件 - 您需要分析您对每条邮件的处理方式。

您还需要尝试容器并发设置(concurrentConsumers),预取等,以获得最佳性能,但它仍然最终成为占用大部分处理时间的侦听器;容器上面有很多垃圾。如果你的监听器构造不好,增加并发性将无济于事。

如果您正在使用交易,那将大大减缓消费。

尝试使用对消息不起作用的侦听器。

最后,在提出这样的问题时,你应该始终显示配置。

答案 1 :(得分:1)

根据Gary的建议,您可以按如下方式设置它们。查看@RabbitListener

@Bean
public SimpleRabbitListenerContainerFactory listenerContainer(     {
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    factory.setConnectionFactory(baseConfig.connectionFactory());
    factory.setConcurrentConsumers(7); // choose a value
    factory.setPrefetchCount(1); // how many messages per consumer at a time
    factory.setMaxConcurrentConsumers(10); // choose a value
    factory.setDefaultRequeueRejected(false); // if you want to deadletter
    return factory;
}