В настоящее время я использую 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 });
Однако при запуске этой строки я получаю сообщение об ошибке «Дескриптор входящей квитанции недействителен».
Обратите внимание: я знаю, что это сообщение не было получено повторно, поэтому регистрируемый дескриптор квитанции должен быть самым последним. Также обратите внимание, что в настоящее время я могу удалять сообщения в том же приложении, просто засыпая после получения сообщения, а затем пытаясь удалить его, как указано выше!
Любые идеи?