【问题标题】:Redeclaration of a binding after queue has been recovered队列恢复后重新声明绑定
【发布时间】:2014-06-16 08:10:42
【问题描述】:

我目前正在做一个 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 在撰写本文时已关闭)

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

【问题讨论】:

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


    【解决方案1】:

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

    在每个queuesChanged() SimpleMessageListenerContainer 调用rabbitAdmin.initialize(),而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 的信息。

    更新

    对,当然,queue 被删除,当没有消费者时。

    看起来你对x-expires(Queue 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

    【讨论】:

    • 但这需要自动删除队列。据我所知,这意味着如果没有消费者连接到队列,它将被自动销毁并删除队列中的任何消息。这也可以通过队列上的 x-expires 参数来实现吗?
    • 请记住,仅检查 x-expires 参数是不够的;使用 [服务器端策略] (rabbitmq.com/ttl.html) 时,队列也可能过期。也许我们应该总是在每个消费者开始时重新声明,以防万一。也就是说,这似乎是一个罕见的极端情况,应用程序上下文正在运行,容器至少在到期时间停止。初始化上下文时,管理员将声明队列。你能描述一下你的用例吗?
    • 加里,我认为这个问题是相关的:stackoverflow.com/questions/24241880/…
    • GaryRussell 我不想要一个自动删除队列,因为如果服务正在重新启动并在一定时间内(比如说 1 分钟)返回,它会清除队列中的所有消息。如果持续时间已过,消费者又回来了,但队列丢失/删除,我希望重新创建它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 2017-06-01
    • 1970-01-01
    • 2020-03-16
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多