【发布时间】:2016-10-12 08:53:04
【问题描述】:
RabbitMQ 提供了选择设置预取计数的能力。
使用 spring-amqp 的 SimpleMessageListenerContainer,我注意到预取计数始终设置。我无法将预取计数设置为 0,因为 SimpleMessageListenerContainer 将其设置为至少 txSize 必须大于零(即使不涉及事务)。那么有没有办法禁用预取计数,即使其无限制?
这里是 spring-amqp 的相关代码:
SimpleMessageListenerContainer.createBlockingQueueConsumer() 这样做:
int actualPrefetchCount = prefetchCount > txSize ? prefetchCount : txSize;
BlockingQueueConsumer.start() 这样做:
if (!acknowledgeMode.isAutoAck()) {
// Set basicQos before calling basicConsume (otherwise if we are not acking the broker
// will send blocks of 100 messages)
try {
channel.basicQos(prefetchCount);
}
Springs 的BlockingQueueConsumer 中总是调用 basicQos() 的原因是什么?没有禁用预取计数的用例吗? (显然自动确认除外)。
The rabbitmq documentation 讨论了使用通道(全局)范围设置预取计数的开销。没有明确提到使用消费者范围设置它与根本不设置它相比是否有任何开销。如果我没记错的话,spring 总是将它设置为消费者范围。它真的没有任何开销吗?没有选项不设置它似乎仍然很奇怪。
谢谢
【问题讨论】:
标签: java spring rabbitmq spring-amqp spring-rabbit