【问题标题】:RabbitMQ consumer thread pool increases with every requestRabbitMQ 消费者线程池随着每个请求而增加
【发布时间】:2017-01-24 09:40:11
【问题描述】:

我使用 RabbitMQ 3.6.6 (AMQP Client 4.0.2) 开发了一个 Java 7 应用程序。我的消费者类扩展了DefaultConsumer。我通过 RabbitMQ 管理控制台发送的每个请求都会根据日志启动一个新线程(pool-2-thread-n):

info: pool-2-thread-10 - NumberConsumer - Number request
info: pool-2-thread-11 - NumberConsumer - Number request
info: pool-2-thread-12 - NumberConsumer - Number request
info: pool-2-thread-13 - NumberConsumer - Number request
info: pool-2-thread-14 - NumberConsumer - Number request
info: pool-2-thread-15 - NumberConsumer - Number request
info: pool-2-thread-16 - NumberConsumer - Number request
info: pool-2-thread-17 - NumberConsumer - Number request
info: pool-2-thread-18 - NumberConsumer - Number request
info: pool-2-thread-19 - NumberConsumer - Number request

我的消费阶层:

public class NumberConsumer extends DefaultConsumer
{
   private static final Logger LOG = Logger.getLogger( NumberConsumer.class );

   public NumberConsumer(final Channel channel)
   {
      super( channel );
   }


   @Override
   public void handleDelivery(final String consumerTag, final Envelope envelope,
         final AMQP.BasicProperties properties, final byte[] body)
      throws IOException
   {
      final String request = new String( body, "UTF-8" );
      NumberConsumer.LOG.info( "Number request" );

      // ... do work and publish response ...
   }
}

这是预期的行为吗? 我很确定每个线程在处理完请求后都会关闭,但为什么它们的数量不受限制?这个可以配置吗?

【问题讨论】:

  • 要提出一个复杂的论点,必须知道池是如何准确配置的。这可能是正常行为。顺便说一句:“pool-x-thread-n”中的数字 n 并不是说​​有 n 个线程(并发)。执行线程是该线程工厂创建的第 n 个线程。
  • 你没有提供自己的 ExecutorService,是吗?
  • 不,我没有。刚刚在文档中看到,ConnectionFactory 有多个 newConnection(..) 方法,允许您设置 ExecutorService

标签: java multithreading rabbitmq


【解决方案1】:

AMQP Java 客户端在ConnectionFactory 中有自己的线程池供消费者使用。如果不使用它,您必须提供自己的ExecutorService 作为newConnection(..) 方法的参数。

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多