避免向DLQ / DLX发送消息

时间:2018-09-25 11:45:07

标签: spring-amqp spring-cloud-stream spring-rabbit spring-rabbitmq

我们的应用程序使用的是org.springframework.cloud,spring-cloud-starter-stream-rabbit框架,并且我们试图避免向DLQ发送特定消息并重试它们,所以这种行为应该以某种方式是动态的,因为对于默认消息,重试和DLQ应该可以工作。

根据此文档:

Putting it All Together

这篇有用的文章:

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

看来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 :(得分:1)

republishToDlq不会看到该异常;它仅在将异常引发到容器(方法causeChainHasImmediateAcknowledgeAmqpException())时适用。

重新发布会颠覆该逻辑,因为不会向容器抛出异常。

请针对Rabbit活页夹打开一个问题,republishToDlq应该尊重该异常并丢弃失败的消息。