我目前正在开发一个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在撰写本文时失败了)
我尝试了这个场景,确实重新创建了我的队列,但是队列和交换之间的绑定都丢失了。如何在删除绑定后重新创建队列?
答案 0 :(得分:0)
如果你的所有声明(Queue
,Exchange
,Binding
)都被注册为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-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