Как игнорировать maxAttempts и отправлять сообщения в DLQ? - PullRequest
0 голосов
/ 27 сентября 2018

Я использую RabbitMQ.Потребительский API использует весенний облачный пар.В настоящее время, поскольку maxAttempts равно 3, если потребитель не сможет обработать сообщение, оно снова будет поставлено в очередь.И это произойдет 3 раза.Если в 3-й раз сообщение также не удалось, то оно будет отправлено DLX-> DLQ.

, как показано на изображении ниже Existing Rabbitmq exchange-queue design

Теперь я хочу пропустить повтор, еслиНекоторое конкретное исключение происходит на стороне слушателя.Как пропустить эту повторную попытку и отправить сообщение в DLX-> DLQ напрямую для конкретного исключения?

Ниже приведен файл конфигурации.

spring:
  application:
    name: consumer-api
  cloud:
    stream:
      overrideCloudConnectors: true
      bindings:
        test_channel:
          destination: destinationName
          contentType: application/json
          group: groupName
          consumer:
            maxAttempts: 3
      rabbit:
        bindings:
          test_channel:
            consumer:
              durableSubscription: true
              exchangeType: direct
              bindingRoutingKey: do.test
              autoBindDlq: true
              deadLetterExchange: destinationName.dlx
              deadLetterQueueName: destinationName.dlx.groupName.dlq
              deadLetterRoutingKey: do.test

Ниже приведен код прослушивателя.

@Slf4j
@Component
public class groupNameListener {

    @StreamListener(TEST_CHANNEL)
    public void doTest(Message<DoTestMessage> doTestMessage) {
        log.info("doTest message received: {}", doTestMessage);

        try {
            if ("someCondition".equals(doTestMessage.getPayload().getMessage())) {
                throw new SpecificException();
            } else {
                log.info("do normal work");
                throw new Exception(); //if something fails
            }
        } catch (SpecificException specificException) {
            log.error("Don't requeue but send to DLQ.... how  ????");
        } catch (Exception ex) {
            log.error("Error in processing do test message");
            throw new AmqpRejectAndDontRequeueException("Reject and Don't requeue exception");
            //this will requeue the message maximum 3 times. If maxAttempts has reached then will be send to DLX->DLQ
        }
    }
}

Может ли кто-нибудь помочь мне?Пожалуйста, дайте мне знать, если я делаю какие-либо ошибки.

1 Ответ

0 голосов
/ 01 октября 2018

В готовящемся выпуске 2.1 добавлена ​​возможность указать, какие исключения являются повторяемыми или нет .

2.1.0.M3 (этап) теперь доступны.

Исключения, которые нельзя повторить, будут отправлены непосредственно в DLQ.

...