Удаление сообщения SQS с дескриптором квитанции

В настоящее время я использую Amazon SQS, и у меня возникают проблемы при попытке удалить сообщения из очереди, которые в настоящее время находятся в состоянии «в полете».

Ниже приведен пример кода:

ReceiveMessageRequest queueRequest = new ReceiveMessageRequest();
        queueRequest.WithMaxNumberOfMessages(1);
        queueRequest.WithQueueUrl(config.QueueURL);
        queueRequest.WithAttributeName("All");

        ReceiveMessageResponse response = sqs.ReceiveMessage(queueRequest);

        if (response.IsSetReceiveMessageResult())
        {
            ReceiveMessageResult result = response.ReceiveMessageResult;

            if (result.IsSetMessage())
            {
                if (result.Message.First() != null)
                {
                    return new Tuple<string, string, bool>(result.Message.First().ReceiptHandle, result.Message.First().Body ?? null, false);
                }
            }
        }

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

sqs.DeleteMessage(new DeleteMessageRequest() { QueueUrl = "urL", ReceiptHandle = handle });

Однако при запуске этой строки я получаю сообщение об ошибке «Дескриптор входящей квитанции недействителен».

Обратите внимание: я знаю, что это сообщение не было получено повторно, поэтому регистрируемый дескриптор квитанции должен быть самым последним. Также обратите внимание, что в настоящее время я могу удалять сообщения в том же приложении, просто засыпая после получения сообщения, а затем пытаясь удалить его, как указано выше!

Любые идеи?


person Samuel Raghunath    schedule 11.06.2012    source источник
comment
Вы разрешили этот Самуэль? Кажется, я столкнулся с той же проблемой.   -  person Jason Hyland    schedule 12.04.2014


Ответы (3)


Убедитесь, что вы используете один и тот же URL-адрес, который ссылается на очередь, при выполнении обеих операций (ReceiveMessage и DeleteMessage).

person bsd    schedule 01.04.2015

Вам нужно дождаться истечения срока действия VisibilityTimeout сообщения, прежде чем вы сможете снова с ним действовать. Это дает машине, обрабатывающей это сообщение, время сделать все, что ей нужно.

person Ryan Parman    schedule 05.10.2012
comment
Предположим, что машина A передает сообщение X. Машина A устанавливает тайм-аут видимости на 2 дня с этого момента. И тогда он начинает работать с этим сообщением (удалите его). Это сработает? - person Ravindranath Akila; 08.06.2015

ReceiptHandle содержит некоторые специальные символы, чувствительные к URL-адресу. Итак, вам нужно сначала закодировать URL-адрес. Я сделал то же самое, и это сработало.

person Hari Das    schedule 10.05.2015