删除的队列未重新定义,消费者停止处理消息

时间:2014-06-23 19:13:48

标签: spring-amqp

我试图解决以下问题:

  1. 我在java conf中定义了2个SimpleMessageListenerContainer。
  2. 他们每个人都有自己的适配器包装的侦听器,他们都使用相同的CachingConnectionFactory(可以吗?)。此外,它们每个都处理不同的队列(具有常量名称)
  3. 我在测试场景时,无论出于何种原因删除其中一个队列。
  4. 当我从Web管理控制台手动删除它时,容器会尝试重新定义此队列并失败(所有重试都失败)。例外并没有真正说明失败的原因。
  5. 最终,此队列的所有消费者线程都重新启动"但他们不会进一步消费任何消息。即使其他人将重新定义此队列(例如,生产者)
  6. 所以有几个问题:

    1. 我能否以某种方式修复队列的重新定义,或检查重新定义失败的原因?在重新开始时,队列的定义有效。这让我想到了下一个问题
    2. 我可以让心跳发送者以某种方式使用守护程序线程吗?它可以防止jvm退出,因此重启不会发生。它不会解决问题,但是新的jvm进程成功地重新定义了队列。重启将由主管引起。
    3. 与此同时,当所有被删除队列的消费者(在第一个容器下)没有真正起作用时我得到的情况,我预计jvm会退出,但是可能因为我有第二个容器就可以了(所有消费者活着并且队列存在),jvm继续存活(可能是当第二个容器关闭时心跳传输器也会停止?)

      任何建议将不胜感激。如果需要,我将发布java配置的代码片段。

1 个答案:

答案 0 :(得分:1)

我们只是通过向侦听器容器添加missing-queues-fatal属性来“修复”它。

See the pull request here

我们无法在点版本中进行架构更改,因此有几种方法可以在1.3.x中进行配置;它已被添加到1.4.x中的模式中,并将在<rabbit:listener-container/>中提供;你可以看到1.4.x Pull Request here

1.3.5应该会在本周晚些时候或之后提供,但如果您愿意,可以立即尝试1.3.5.BUILD-SNAPSHOT

当它设置为false(默认为true)时,容器将使用recovery-interval进入恢复模式。

Documentation for the 1.3.5. snapshot is here