Я использую RabbitMQ.Потребительский API использует весенний облачный пар.В настоящее время, поскольку maxAttempts равно 3, если потребитель не сможет обработать сообщение, оно снова будет поставлено в очередь.И это произойдет 3 раза.Если в 3-й раз сообщение также не удалось, то оно будет отправлено DLX-> DLQ.
, как показано на изображении ниже
Теперь я хочу пропустить повтор, еслиНекоторое конкретное исключение происходит на стороне слушателя.Как пропустить эту повторную попытку и отправить сообщение в 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
}
}
}
Может ли кто-нибудь помочь мне?Пожалуйста, дайте мне знать, если я делаю какие-либо ошибки.