Прослушиватель Amazon SQS — использование сообщения и настройка атрибутов до того, как сообщение будет отклонено

У меня есть очередь fifo, и я использую org.springframework.cloud.aws.messaging, и вот что я хотел бы сделать:

  1. Потребляйте сообщение
  2. Попробуй справиться с этим (внутренняя логика)
  3. Если дескрипторы не работают - записать в сообщение новый атрибут (без повторной отправки сообщения в очередь)

Я не хочу отправлять сообщения в новую очередь (мне нужно сохранить порядок сообщений). также я не хочу использовать очередь недоставленных сообщений для обработки ошибок (по той же причине, что и выше).

причина, по которой я хочу использовать атрибуты сообщения, связана с тем, что мне нужно реализовать внутренний механизм повторных попыток, что означает: при использовании сообщения я проверю last_try_timestamp, и если оно прошло мою проверку, я попытаюсь обработать его , иначе я выкину ошибку. (Я знаю, что сообщение будет продолжать использоваться до MaxRetention, и меня это устраивает)

Возможно ли что-то подобное?

 @SqsListener(value = "#{'${my.queue.fifo}'}", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
    public void deadLetterQueueListener(@Headers Map<String, String> headers, String message) throws Exception {
        log.info("consuming message");
        if(!this.handleMessage(message)){
            //Set message attributes (timestamp)
            throw new Exception("Failed to handle message");
        }
    }


person razrog    schedule 17.05.2020    source источник


Ответы (1)


Насколько я знаю, с помощью SQS это сделать невозможно. Если вы измените атрибут сообщения, вам потребуется повторно отправить это сообщение, чтобы распространить это изменение на SQS.

Его можно реализовать на стороне приложения, сохранив метаданные, такие как last_try_timestamp, во внешнем источнике данных, таком как DynamoDB, где вы можете сопоставить идентификатор сообщения с любыми метаданными, которые вам нужны.

person Maciej Walkowiak    schedule 20.07.2020