【发布时间】: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