我们的应用程序使用的是org.springframework.cloud,spring-cloud-starter-stream-rabbit框架,并且我们试图避免向DLQ发送特定消息并重试它们,所以这种行为应该以某种方式是动态的,因为对于默认消息,重试和DLQ应该可以工作。
根据此文档:
这篇有用的文章:
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并重新排队吗?
答案 0 :(得分:1)
republishToDlq
不会看到该异常;它仅在将异常引发到容器(方法causeChainHasImmediateAcknowledgeAmqpException()
)时适用。
重新发布会颠覆该逻辑,因为不会向容器抛出异常。
请针对Rabbit活页夹打开一个问题,republishToDlq
应该尊重该异常并丢弃失败的消息。