我目前正在使用亚马逊的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);
}
}
}
现在,在收到Handle和消息正文之后,我将Receipt句柄字符串存储到云存储中(例如DynamoDB)。然后,我稍后将该句柄加载到存储服务之外,并使用类似于以下内容的方式调用删除:
sqs.DeleteMessage(new DeleteMessageRequest() { QueueUrl = "urL", ReceiptHandle = handle });
但是,在运行该行时,我收到“输入收据句柄无效”错误消息。
注意,我知道此消息未被重新接收,因此记录的收据句柄应该是最新的。另请注意,我现在可以删除同一个应用程序中的消息,只需在收到消息后休眠,然后尝试按上述方式删除它!
有什么想法吗?
答案 0 :(得分:2)
您必须等到消息的VisibilityTimeout已过期,然后才能再次对其进行操作。这使得处理该消息的机器有时间做它需要做的事情。
答案 1 :(得分:1)
在执行这两个操作(ReceiveMessage和DeleteMessage)时,请确保使用的引用队列完全相同。
答案 2 :(得分:0)
ReceiptHandle包含一些对URL敏感的特殊字符。所以你需要先对它进行URL编码。我做了同样的工作。