Избегайте отправки сообщения в DLQ / DLX - PullRequest
0 голосов
/ 25 сентября 2018

Наше приложение использует org.springframework.cloud, инфраструктуру spring-cloud-starter-stream-rabbit, и мы стараемся избегать отправки определенных сообщений в DLQ, а также повторять их, это поведение должно быть каким-то динамическим, потому что длясообщения по умолчанию, повторные попытки и DLQ должны работать.

Согласно этой документации:

Собираем все вместе

И этот полезный пост:

DLX в rabbitmq и spring-rabbitmq - некоторые соображения об отклонении сообщений

Кажется, что ImmediateAcknowledgeAmqpException может использоваться в весеннем AMQP для пометки сообщения как подтвержденного и без дальнейшей обработкиЭто.Однако, когда мы используем этот код:

@StreamListener(LogSink.INPUT)
public void handle(Message<Map<String, Object>> message) {

    if (message.getPayload().get("condition1").equals("abort")) {
        throw new ImmediateAcknowledgeAmqpException("error, we don't want to send this message to DLQ");
    }

    ...
}

Сообщение всегда отправляется в DLQ

Наша текущая конфигурация:

spring.cloud.stream:
  bindings:
    log:
      consumer.concurrency: 10
      destination: log
      group: myGroup
      content-type: application/json
  rabbit.bindings:
    log:
      consumer:
        autoBindDlq: true
        republishToDlq: true
        transacted: true

Мы что-то упустили?Есть ли другая альтернатива, чтобы избежать публикации в DLQ и постановки в очередь?

1 Ответ

0 голосов
/ 25 сентября 2018

republishToDlq не смотрит на это исключение;оно применяется только в том случае, если исключение выдается в контейнер (метод causeChainHasImmediateAcknowledgeAmqpException()).

Повторная публикация нарушает эту логику, поскольку в контейнер не выдается исключение.

Пожалуйста, откройте проблему для Rabbitbinder, republishToDlq должен учитывать это исключение и отбрасывать сообщение об ошибке.

...