1

我目前正在开发一个 rabbit-amqp 实现项目,并使用 spring-rabbit 以编程方式设置我所有的队列、绑定和交换。

如果队列被删除并在参考文档中找到以下内容,我正在尝试重新创建队列:

3.14 监听容器队列

1.3 版引入了许多改进,用于在侦听器容器中处理多个队列。

容器必须配置为至少侦听一个队列;以前也是如此,但现在可以在运行时添加和删除队列。处理完任何预取消息后,容器将回收(取消并重新创建)消费者。请参阅方法 addQueues、addQueueNames、removeQueues 和 removeQueueNames。移除队列时,必须至少保留一个队列。

如果任何队列可用,消费者现在将启动 - 以前,如果任何队列不可用,容器将停止。现在,只有在没有可用队列的情况下才会出现这种情况。如果不是所有队列都可用,容器将尝试每 60 秒被动声明(并从中消耗)丢失的队列。...(来源:http ://docs.spring.io/spring-amqp/docs/1.3.4.RELEASE/reference/html在撰写本文时已关闭)

我尝试了这种情况,并且确实重新创建了我的队列,但是队列和交换之间的绑定丢失了。删除后如何使用绑定重新创建队列?

4

1 回答 1

1

实际上,如果您的所有声明(Queue, Exchange, Binding)都注册为 bean,它应该可以工作。

在每个queuesChanged() SimpleMessageListenerContainer调用rabbitAdmin.initialize()上,谁依次处理提到的 RabbitMQ 环境。

它仅在这种情况下发生:

if (queueNames.contains(queue.getName()) && queue.isAutoDelete()
                        && this.rabbitAdmin.getQueueProperties(queue.getName()) == null) {

如果Queuefrom 应用程序上下文包含在 currentqueueNames中,auto-delete并且它不存在于 Broker( rabbitAdmin.getQueueProperties) 尝试连接到 Broker 以获取有关 的信息Queue

更新

没错,当然queue是在没有消费者的时候被删除。

看起来您对x-expiresQueue TTL)是正确的,我们也应该处理这个问题:

if (queueNames.contains(queue.getName())
          && (queue.isAutoDelete() || queue.getArguments().containsKey("x-expires")))
      && this.rabbitAdmin.getQueueProperties(queue.getName()) == null) {

随意提出 JIRA 问题: https ://jira.spring.io/browse/AMQP

感谢您指出 - +1

于 2014-06-16T08:36:34.550 回答