我正在使用spring-cloud-stream在微服务之间进行通信。我在Rabbit MQ Broker中具有以下预定义的设置。

"first" -> exchange of type Topic which is bound to Queue (name="user.create",x-dead-letter-exchange="first.dlx")
"first.dlx" -> dead letter exchange of type Topic


和以下配置文件:

spring:
    cloud:
        stream:
            bindings:
                consumer-input:
                  group: user.create
                  destination: first
                  contentType: application/json
                  binder: rabbit
            binders:
                rabbit:
                  type: rabbit
            rabbit:
                bindings:
                  consumer-input:
                    consumer:
                      acknowledgeMode: manual
                      declareExchange: false
                      queueNameGroupOnly: true
                      bindQueue: false
                      deadLetterExchange: first.dlx
                      autoBindDlq: true
                      deadLetterRoutingKey: user.create.dlq


当我启动应用程序时说:

[AMQP Connection 127.0.0.1:5672] ERROR o.s.a.r.c.CachingConnectionFactory - Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'type' for exchange 'first.dlx' in vhost '/': received 'direct' but current is 'topic', class-id=40, method-id=10)


因为Rabbit mq尝试声明类型为“直接”的dlx。这是repo的链接。

所以我的问题……有什么办法告诉兔子mq声明除“直接”之外的其他类型的dlx,例如属性名:“ deadLetterExchangeType:topic”?还是根本不声明dlx。

任何其他建议将非常有帮助。

最佳答案

当前无法定义DLX交换类型或阻止其声明。请打开issue against the binder

仅允许指定类型可能是不够的,因为它可能具有其他不兼容的参数。我们可能应该添加declareDlx,类似于declareExchange

10-04 14:10