Я делаю следующие шаги:
- MessageListener получает сообщение из очереди Q1
- Подтвердите сообщение
- Если проверка не удалась, вызовите channel.basicReject () и переместите его в очередь недоставленных сообщений.
- Иначе, скажем, сервер электронной почты выходит из строя. Я вызываю channel.basicReject () со значением Requeue true и генерирую исключение. Он переходит к шаблону повтора и после maxAttempts восстанавливается (RepublishMessageRecoverer) и попадает в очередь недоставленных сообщений.
Но это не удаляет сообщение из Q1.
public void onMessage(Message message, Channel channel) throws Exception {
try {
validateMessage();
processMessage(message);
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
}
catch (DataValidationException ex){
channel.basicReject(message.getMessageProperties().getDeliveryTag(),false);
}
catch(DownstreamAppException ex) {
channel.basicReject(message.getMessageProperties().getDeliveryTag(),true);
throw ex;
}
}
void validMessage() {
..
throw new DataValidationException();
}
void processMessage() {
...
throw new DownstreamAppException();
}
Я не хочу повторно ставить в очередь сообщения, не прошедшие проверку, но хочу повторно ставить в очередь те, которые не были обработаны из-за сбоя в каком-либо последующем приложении, для повторных попыток.
Пара вопросов: 1. Если я не сгенерирую исключение в перехвате DownstreamAppException, сообщение не будет выброшено retryTemplate и recoverer. Это потому, что запрос отклоненного сообщения является новым?
- Почему сообщение не удаляется из Q1? и как я могу это исправить?
Спасибо