Неправильная привязка для DLQ Rabbit при использовании Spring Cloud Stream - PullRequest
0 голосов
/ 29 мая 2019

У меня есть одно простое приложение Spring Cloud Stream со следующей конфигурацией

spring:
    cloud:
        stream:
            rabbit:
                bindings:
                    input:
                        consumer:
                            exchangeType: topic
                            bindingRoutingKey: service.routing
                            autoBindDlq: true
                            deadLetterExchange: service.exchange.error
                            deadLetterQueueName: service.queue.error
                            deadLetterRoutingKey: service.routing.error
                            deadLetterExchangeType: topic
                            queueNameGroupOnly: true
                            republishToDlq: true
            bindings:
                input:
                    destination: service.exchange
                    group: service.queue
                    binder: rabbit
                    consumer:
                        errorChannelEnabled: true
                        maxAttempts: 2
                        concurrency: 3
            binders:
                rabbit:
                    type: rabbit
                    environment:
                        spring:
                            rabbitmq:
                                host: ${RABBITMQ_HOST:localhost}
                                port: ${RABBITMQ_PORT:5672}
                                username: ${RABBITMQ_USERNAME:guest}
                                password: ${RABBITMQ_PASSWORD:guest}

Все выглядит хорошо, но привязка в DLQ неверна, в результате DLQ не получает никакого сообщения.

Ожидаетсярезультат

Exchange (service.exchange.error) -> Маршрутизация (service.routing.error) -> Очередь (service.queue.error)

Фактический результат

Exchange (service.exchange.error) -> Маршрутизация (service.queue) -> Очередь (service.queue.error)

Есть ли способ решить эту проблему?

1 Ответ

0 голосов
/ 29 мая 2019

Когда republishToDlq равно true, мы также связываемся с именем очереди, потому что переиздатель ничего не знает о разделенных адресатах.

Binding dlqBinding = new Binding(dlq.getName(), DestinationType.QUEUE,
        dlxName, properties.getDlqDeadLetterRoutingKey() == null ? routingKey
                : properties.getDeadLetterRoutingKey(),
        null);
declareBinding(dlqName, dlqBinding);
if (properties instanceof RabbitConsumerProperties
        && ((RabbitConsumerProperties) properties).isRepublishToDlq()) {
    /*
     * Also bind with the base queue name when republishToDlq is used, which
     * does not know about partitioning
     */
    declareBinding(dlqName, new Binding(dlq.getName(), DestinationType.QUEUE,
            dlxName, baseQueueName, null));
}

Итак, вы должны увидеть 2 привязки - вашу и дополнительную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...