gpt4 book ai didi

java - Spring 2.1.0.M4rabbitmq声明队列并在运行时将它们绑定(bind)到监听器

转载 作者:行者123 更新时间:2023-12-02 10:42:52 25 4
gpt4 key购买 nike

假设我有一个声明的监听器:

Listener.java

@RabbitListener(id = "test listener 1")
public String test2(String req) {
return req + " result";
}

我试图在运行时通过队列公开它:

ListenerTest.java

Queue declaredQueue = new Queue("new.queue", false);

admin.declareQueue(declaredQueue);

SimpleMessageListenerContainer listener = (SimpleMessageListenerContainer)
registry.getListenerContainer("test listener 1");
listener.addQueues(declaredQueue);

然后我尝试向新声明的队列发送消息:

String result = template.convertSendAndReceiveAsType("new.queue", "req", ParameterizedTypeReference.forType(String.class));

但它只是超时并返回 null。

当我在调试器中检查监听器时,我看不到任何绑定(bind)到新队列的消费者 enter image description here

可以通过rabbit config here找到和其余的源代码来测试这个 here

值得注意的是,这个确切的设置适用于 Spring Boot 版本2.0.5.RELEASE,因此这可能是一个错误。我需要找到一种方法来重新初始化消费者。

最佳答案

在运行时添加队列将导致容器回收其消费者(相当于停止并重新启动容器)。请参阅https://github.com/spring-projects/spring-amqp/blob/master/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/SimpleMessageListenerContainer.java#L687这是由于消费者的设计方式造成的;每个消费者线程从多个队列中消费。

更改消费者数量不会重新启动所有消费者;请参阅https://github.com/spring-projects/spring-amqp/blob/master/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/SimpleMessageListenerContainer.java#L168

新的DirectMessageListenerContainer添加队列时不需要重新启动其消费者(每个队列至少有一个消费者)。

但是,它不支持动态并发扩展。

关于java - Spring 2.1.0.M4rabbitmq声明队列并在运行时将它们绑定(bind)到监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52806200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com