当前位置: 首页 > 知识库问答 >
问题:

使用接收句柄删除SQS消息

濮阳默
2023-03-14

我目前正在使用亚马逊的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)。随后,我从存储服务中加载该句柄,并使用类似于以下内容的方式调用delete:

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

但是,当运行该行时,我收到一条“输入收据句柄无效”的错误消息。

注意,我知道这条消息没有被重新接收,所以记录的接收句柄应该是最新的。还要注意的是,我现在可以在同一个应用程序中删除消息,只需在收到消息后Hibernate,然后像上面那样尝试删除它!

有什么想法吗?

共有3个答案

柏麒
2023-03-14

ReceiptHandle包含一些特殊字符,这些字符对网址很敏感。所以你需要首先对网址进行编码。我也是这么做的,它起作用了。

能钟展
2023-03-14

您必须等到消息的VisibilityTimeout过期后才能再次对其执行操作。这使得处理该消息的机器有时间做它需要做的任何事情。

芮承运
2023-03-14

在执行这两个操作(ReceiveMessage和DeleteMessage)时,请确保使用的URL与引用队列的URL完全相同。

 类似资料:
  • 我正在探索AWS SQS服务。当尝试使用java sdk从队列中删除消息时,我遇到了一些问题。 队列是在SQS中创建的,它有三条消息。该队列由AWS3存储支持,用于处理大型消息。 下面是通过多次轮询接收消息的方法。 日志消息: 我搞不清例外的原因。在上面的使用java SDK的代码片段中,我是否遗漏了什么? 提前感谢任何建议。

  • 我试图写一个请求从我的服务器获取消息在使用签名,消息看起来像这样, POST/134148934511/Localhost/?Action=ReceiveMessage 但我收到了一条错误消息(尽管我拥有所需的权限)。(我确信aws版本4的签名过程是正确的(通过S3检查))我做错了什么?

  • 我创建了一个SNS主题,通过cli发布来自Cloudformation的所有信息。然而,当我检查队列时,它没有接收任何SNS消息。我通过订阅我的电子邮件来验证SNS是否正常工作,所以问题似乎出在队列和SNS之间的连接上。然而,我没有发现我的语法有任何问题。一、 据我所知,他们严格遵循了亚马逊的文档。 猛击:

  • 我有一系列来自SQS队列事件触发器的AWS Lambdas。但是,有时当我试图从队列中删除消息时,尝试会一次又一次地超时,直到我的Lambda超时发生。 我启用了调试日志记录,确认这是套接字超时,但除此之外,我没有得到任何进一步的详细信息。这似乎也是不规则的。起初,我认为这是一个Lambda预热问题,但在成功运行Lambda多次并在第一次部署时,我发现了这个问题。 到目前为止,我所尝试的: 我想也

  • 我试图通过社交网络从亚马逊SES获得电子邮件回复(退回、投诉和交付)。在亚马逊SQS控制台上,我看到消息已经在队列中,所以我确信亚马逊上的结构设置是正确的。 然后,使用Laravel 5.5,按照官方指南,我设置了一个队列来听SQS。我跳过了将作业分配到队列的部分,因为这将由SNS完成。为了简单起见,在作业处理程序中,我只需要转储我收到的内容。作业如下所示: 其配置如下所示: 为安全起见,实际值隐

  • 我有一个主应用程序将消息发送到SQS队列,希望4个消费者应用程序使用相同的消息,并按自己的意愿进行处理 我不确定用于此目的的队列体系结构。 我看到标准SQS、SQS FIFO、(SQS SNSTopic)的选项 对于我想要的功能,似乎(SQS SNS主题)或Kenesis将是一条可行的道路。 但是我也有一个关于标准SQS的问题 我想我是混淆之间的所有选项和压倒了所有的信息可用的队列但仍然感到困惑哪