队列恢复后重新声明绑定

时间:2014-06-16 08:10:43

标签: spring-integration spring-amqp spring-rabbit

我目前正在开发一个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在撰写本文时失败了)

我尝试了这个场景,确实重新创建了我的队列,但是队列和交换之间的绑定都丢失了。如何在删除绑定后重新创建队列?

1 个答案:

答案 0 :(得分:0)

如果你的所有声明(QueueExchangeBinding)都被注册为bean,那么它实际上应该有效。

在每个queuesChanged() SimpleMessageListenerContainer调用rabbitAdmin.initialize(),然后,他们会处理提到的RabbitMQ环境。

只有在这种情况下才会发生:

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

如果应用程序上下文中的Queue包含在当前queueNames中,则它是auto-delete并且它在Broker(rabbitAdmin.getQueueProperties)尝试连接时不存在到经纪人获取有关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