【问题标题】:How to turn off auto queue declaration in Spring Boot for existing RabbitMQ queues?如何在 Spring Boot 中为现有 RabbitMQ 队列关闭自动队列声明?
【发布时间】:2020-09-14 07:33:12
【问题描述】:

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

App A => Creates its own queue A

App B => Listens to queue A

现在问题是当我们修改队列时说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-boot rabbitmq


    【解决方案1】:

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

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

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

    【讨论】:

    • 所以你的意思是我们可以只使用名称作为字符串而不需要实例化Queue?
    • 是的。发送者不应该关心队列是如何创建的,这取决于接收者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 2017-04-17
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    相关资源
    最近更新 更多