1

We do use an SQS to receive notifications from S3, but for some reason we receive the exact same message again and again.

Seems like the message never gets deleted from SQS.

@Component
@RequiredArgsConstructor
public class SqsTimer {

    private final SqsFacade sqsFacade;

    @Scheduled(fixedDelay = 2000)
    public void execute() {
        List<Message> messages;
        do {
            messages = receiveMessages();
            distributeMessages(messages);
            deleteMessages(messages);
        } while (!messages.isEmpty());
    }

    private List<Message> receiveMessages() {
        final ReceiveMessageRequest receiveMessageRequest = ReceiveMessageRequest.builder()
                .queueUrl("URL")
                .visibilityTimeout(30)
                .build();

        return sqsFacade.getSqsClient()
                .receiveMessage(receiveMessageRequest)
                .messages();
    }

    private void distributeMessages(final List<Message> messages) {
        ...
    }

    private void deleteMessages(final List<Message> messages) {
        messages.forEach(message -> {
            log.debug("Delete message: {}", message.receiptHandle());
            final DeleteMessageRequest deleteMessageRequest = DeleteMessageRequest.builder()
                    .queueUrl("URL")
                    .receiptHandle(message.receiptHandle())
                    .build();
            sqsFacade.getSqsClient().deleteMessage(deleteMessageRequest);
        });
    }
}

The method distributeMessages() completes in under 1 second!

  1. Why do we receive the same message again and again?
  2. Why are the messages not deleted?
  • 2
    Once an SQS message is consumed, it's effectively hidden by SQS for a given "visibility timeout", after which it will be "back" in the queue, unless it's deleted first. Are you successfully deleting the message? Alternatively, is the "visibility timeout" set too low perhaps? – Boaz Mar 17 '22 at 11:25
  • @Boaz Like I said, the method distributeMessages() only takes 1 second, so the visibility timeout should be enough! How would I know if the message was deleted successfully? There is no exception whatsoever – Patrick Brielmayer Mar 17 '22 at 11:38
  • The AWS Console should show the state of the messages in the queue. For example, see this [related post on SQS](https://stackoverflow.com/questions/19792881/why-do-sqs-messages-sometimes-remain-in-flight-on-queue) – Boaz Mar 17 '22 at 11:50

0 Answers0