当前位置: 首页 > 知识库问答 >
问题:

Spring AMQP在队列Bean上设置预取计数

姜业
2023-03-14

如何为此队列使用者设置预取计数?

@Bean
public Queue eventQueue(AmqpAdmin amqpAdmin) {
    Queue queue = QueueBuilder.durable(EVENT_QUEUE_NAME)
            ...
            .build();

    TopicExchange topicExchange = new TopicExchange(TOPIC_EXCHANGE, true, false);

    amqpAdmin.declareBinding(BindingBuilder
            .bind(queue)
            .to(topicExchange)
            .with(EVENT_ROUTING_KEY));

    return queue;
}

文档指出,这是一个容器配置,但在我的factory bean上设置它不起作用,默认值为250:

    @Bean
    public SimpleRabbitListenerContainerFactory containerFactory(ConnectionFactory connectionFactory) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setPrefetchCount(10); // doesn't work; defaults to 250
        return factory;
    }

更新

根据@GaryRussell下面的评论,我测试了默认的rabbitListenerContainerFactory,还验证了我的Spring Boot配置。rabbitmq。听众。易于理解的预取正在AbstractRabbitListenerContainerFactoryConfigurer中使用。但是,当我查看RabbitMQ中的队列使用者时,我可以看到我使用默认容器设置定义的队列仍然具有250的预取计数:

我使用RabbitMQ管理面板作为真相的来源。我不认为这是在撒谎,因为我有一堆使用自定义容器实例化的动态队列,并且它们确实具有非默认(正确)的prefetchCounts。我还在Spring容器启动中验证了只有一个(预期)RabbitListenerContainerFactorybean。

共有1个答案

商正浩
2023-03-14

预回迁不是队列属性,而是使用者属性。

你的听众长什么样?

您正在为容器工厂使用非标准名称。

您要么需要将容器工厂属性添加到@RabbitListener,要么需要将您的bean重命名为RabbitListenerContainerFactory(覆盖Boot定义的工厂@Bean)。

而且

amqpAdmin.declareBinding(BindingBuilder

您不应该在bean定义中与经纪人交谈——现在还为时过早。

只需将队列、交换和绑定添加为Bean,您也可以在应用程序中设置预取。属性/yaml文件(如果使用Spring Boot)。管理员将在第一次打开连接时找到并声明它们。

编辑

还有别的事情。。。

@SpringBootApplication
public class So62049769Application {

    public static void main(String[] args) {
        SpringApplication.run(So62049769Application.class, args);
    }

    @Bean
    public Queue queue() {
        return new Queue("so62049769");
    }

    @RabbitListener(queues = "so62049769")
    public void listen(String in) {
        System.out.println(in);
    }

}
spring.rabbitmq.listener.simple.prefetch=42
 类似资料:
  • 在SNS话题上设置死信队列和在Lambda功能上设置死信队列有什么区别? 我在想,因为如果您在SNS订阅上设置DLQ,那么当Lambda(订阅者)失败时,订阅消息将故障转移到DLQ,对吗?那么在这种情况下,在这两个地方设置DLQ会有相同的效果吗? 我在SNS主题订阅上设置了一个DLQ,它并没有“自动”地显示为Lambda屏幕设置上的DLQ,所以我想可能会有一些不同? SNS死信队列ref:http

  • 问题内容: 也许这是一个愚蠢的问题,但我似乎找不到一个明显的答案。 我需要一个仅包含唯一值的并发FIFO队列。尝试添加队列中已经存在的值只会忽略该值。如果不是为了线程安全,那将是微不足道的。在Java中是否存在数据结构,或者在Interweb上是否存在代码snipit表现出这种行为? 问题答案: 如果您想要比完全同步更好的并发性,那么我知道有一种方法可以使用ConcurrentHashMap作为支

  • (在iQueueBrowser.GetEnumerator上进行了探索,但它会将消息下载到客户端。)

  • 这可能是Websphere MQ中的权限问题吗? 我运行了ALTER QMGR CHLAUTH(禁用)以排除任何权限问题(我希望如此)。 代理服务

  • 问题内容: 我的ActiveMQ服务器中目前有一个名为的队列。每当消息处理失败时,ActiveMQ都会创建一个默认目录。是否可以将该名称更改为类似的名称?原因是将来我可能会有几个队列,而我希望它像 问题答案: 您要查找的东西称为,在此过程中,ActiveMQ为每个队列/主题创建特定的DLQ, 您可以按如下,通过调整你实现它有点 此配置将创建名称为的DLQ ,如果您不需要前缀,则可以删除属性。 希望

  • 问题内容: 如何同时在多个对象上“选择” ? Golang的频道具有所需的功能: 其中第一个要解除阻塞的通道执行相应的块。如何在Python中实现? 更新0 根据tux21b答案中给出的链接,所需的队列类型具有以下属性: 多生产者/多消费者队列(MPMC) 提供每个生产者FIFO / LIFO 当队列为空/完整的消费者/生产者被阻止时 此外,渠道可能会被阻塞,生产者将阻塞,直到消费者取回该物品为止