首页 > 解决方案 > RabbitMq 忽略 Channel.basicQos()

问题描述

我正在开发一个使用 RabbitMq 和 Micronaut(v1.1.3) 框架的应用程序,这个应用程序的目标是在队列中写入文件的路径。工作人员(RabbitListeners)使用队列并对指定的文件执行某些操作。这些操作可能很繁重,因此我不希望队列立即将消息分配给第一个可用的工作人员,以避免工作人员超载。我已经读到您需要设置“prefetch_count”以防止工人超载。问题是 channel.basicQos (1) 被完全忽略,因此队列中没有设置 prefetch_count。

@Singleton
public class ChannelPoolListener extends ChannelInitializer {

    @Override
    public void initialize(Channel channel) throws IOException {
        channel.basicQos(1);
        channel.exchangeDeclare("micronaut", BuiltinExchangeType.DIRECT, true);
        channel.queueDeclare("log", true, false, false, null);
        channel.queueBind("log", "micronaut", "log");
    }
}

标签: rabbitmqmicronaut

解决方案


在初始化程序中传递的通道不能保证在该范围之外使用。您需要在Queue注释中设置预取。见https://micronaut-projects.github.io/micronaut-rabbitmq/latest/api/io/micronaut/configuration/rabbitmq/annotation/Queue.html#prefetch--


推荐阅读