Мой вопрос не очень простой, но я верю, что с вашей помощью я найду решение моей проблемы.У меня есть микросервис, который читает сообщения из очереди AWS SQS и сохраняет их в Redis.
В AWS у меня есть две очереди:
- AQueue (стандартная очередь)
- DeadLetterQueue
Я бы хотел:
- Удалить сообщения из моей стандартной очереди (AQueue) и переместить их в DeadLetterQueue, например, при 5-кратном разборе ошибок
- Когда, например, мой Redis временно недоступен, я не хочу удалять прочитанные в данный момент сообщения.В этом случае эти сообщения следует читать снова и снова, пока Redis не заработает.
КАК я могу это сделать?В AWS я установил свою стандартную очередь (AQueue) для отправки сообщений в DeadLetterQueue, когда сообщения не будут работать 5 раз
Мой слушатель:
@SqsListener(value = "${amazon.sqs.destination}", deletionPolicy = SqsMessageDeletionPolicy.NEVER)
public void receive(String requestJSON, Acknowledgment acknowledgment) {
try (Jedis jedis = jedisPool.getResource()) {
if (redisPassword != null && !redisPassword.isEmpty()) {
jedis.auth(redisPassword);
}
long key = jedis.incr("Trace:");
Trace trace = Trace.fromJSON(requestJSON);
trace.setTechnicalId(Long.toString(key));
traceRepository.save(trace);
acknowledgment.acknowledge();
}catch (IOException e) {
log.error("Parse error: " + e.getMessage());
queueMessagingTemplate.convertAndSend(deadLetterQueue, requestJSON);
acknowledgment.acknowledge();
} catch(Exception e){
log.error("Problem with NOSQL database Redis: " + e.getMessage());
}
К сожалению, ДАЖЕ, КОГДА я не звонюacknowledgment.acknowledge();
мое сообщение после 5 попыток перемещается в DeadLetterQueue.