Javier Sánchez
Javier Sánchez

Reputation: 1054

Avoid sending message to DLQ/DLX

Our application is using org.springframework.cloud, spring-cloud-starter-stream-rabbit framework and we are trying to avoid sending specific messages to DLQ and also retrying them, this behaviour should be somehow dynamically, because, for the default messages, retries and DLQ should work.

According to this documentation:

Putting it All Together

And this useful post:

DLX in rabbitmq and spring-rabbitmq - some considerations of rejecting messages

It seems that ImmediateAcknowledgeAmqpException could be used in spring AMQP to mark a message as acknowledged and no further process it. However, when we use this code:

@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");
    }

    ...
}

The message is always send to DLQ

Our current configuration:

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

Are we missing something? Is there any other alternative to avoid publishing to DLQ and requeuing?

Upvotes: 1

Views: 618

Answers (1)

Gary Russell
Gary Russell

Reputation: 174664

republishToDlq does not look at that exception; it only applies when the exception is thrown to the container (method causeChainHasImmediateAcknowledgeAmqpException()).

Republishing subverts that logic since no exception is thrown to the container.

Please open an issue against the Rabbit binder, republishToDlq should honor that exception and discard the failed message.

Upvotes: 1

Related Questions