删除带有收据句柄的 SQS 消息

本文关键字:SQS 消息 句柄 删除 | 更新日期: 2023-09-27 18:37:01

我目前正在使用亚马逊的 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 });

但是,在运行该行时,我收到"输入收据句柄无效"错误消息。

请注意,我知道此消息尚未重新收到,因此正在记录的接收句柄应该是最新的。另请注意,我目前可以在同一应用程序中删除消息,只需在收到消息后睡觉,然后尝试如上所述删除它!

有什么想法吗?

删除带有收据句柄的 SQS 消息

确保在执行这两个操作(接收消息和删除消息)时使用引用队列的完全相同的 URL。

您必须等到消息的可见性超时过期,然后才能再次对其执行操作。这允许处理该消息的机器有时间做它需要做的任何事情。

ReceiptHandle 包含一些特殊字符,这些字符对 URL 很敏感。因此,您需要首先对其进行URL编码。我做了同样的事情,它奏效了。