首页 > 解决方案 > 如何在 Spring Boot 中为现有 RabbitMQ 队列关闭自动队列声明?

问题描述

我们有许多 micore 服务。每个微服务声明并创建自己的队列,但有一个微服务监听其中一些队列。

App A => Creates its own queue A

App B => Listens to queue A

现在的问题是当我们修改 say 上的队列时App A,例如添加死信队列或添加ttl等,App B失败例如这个错误:

Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED 
- inequivalent arg 'x-dead-letter-exchange' for queue 'queue-app-a' in vhost '/': 
  received none but current is the value 'direct-exchange' of type 'longstr', class-id=50, method-id=10)

现在这个特殊错误是因为在 A 上我们配置了死信队列,但在 B 中我们只是将代码保留为:

    @Bean
    public Queue queueAppA() {
        return new Queue("queue-app-a");
    }

有没有办法告诉 Spring 使用现有的可用队列而不是尝试声明它App B?否则,我们必须让这些代码保持同步,这既痛苦又容易出错,因为开发人员甚至可能都不知道。

标签: spring-bootrabbitmq

解决方案


通常,发送者对消费队列一无所知。您拥有的发送到队列的服务不必知道有关队列的任何信息(仅知道队列的名称)。

然后他们可以发送到队列名称,如果队列存在,则消息将降落在那里,如果它不存在,则消息将消失。

只有消费服务应该知道队列(它应该只由该服务定义)这样你就可以避免你遇到的问题。


推荐阅读