如何忽略 maxAttempts 并将消息发送到 DLQ?
How to ignore maxAttempts & send message to DLQ?
我正在使用 RabbitMQ。消费者-api 正在使用 spring-cloud-steam。
目前,由于 maxAttempts 为 3,如果消费者处理消息失败,则会重新排队。这将发生 3 次。
如果第 3 次消息也失败,则将发送到 DLX->DLQ。
如下图所示
现在我想在侦听器端发生某些特定异常时跳过重试。 specificException如何跳过这次重试直接发消息到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
}
}
}
有人可以帮助我吗?如果我犯了任何错误,请告诉我。
即将发布的 2.1 版本 adds the feature to specify which exceptions are, or are not, retryable。
2.1.0.M3(里程碑)现已推出。
不可重试的异常将直接进入 DLQ。
我正在使用 RabbitMQ。消费者-api 正在使用 spring-cloud-steam。 目前,由于 maxAttempts 为 3,如果消费者处理消息失败,则会重新排队。这将发生 3 次。 如果第 3 次消息也失败,则将发送到 DLX->DLQ。
如下图所示
现在我想在侦听器端发生某些特定异常时跳过重试。 specificException如何跳过这次重试直接发消息到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
}
}
}
有人可以帮助我吗?如果我犯了任何错误,请告诉我。
即将发布的 2.1 版本 adds the feature to specify which exceptions are, or are not, retryable。
2.1.0.M3(里程碑)现已推出。
不可重试的异常将直接进入 DLQ。