首页 文章

队列恢复后重新声明绑定

提问于
浏览
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在撰写本文时失败了)

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

1 回答

  • 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 )上不存在尝试连接到Broker以获取有关 Queue 的信息 .

    UPDATE

    当然,当没有消费者时, 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

相关问题