Amazon Simple Queue Service
开发人员指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

教程:接收和删除来自 Amazon SQS 队列的消息

将消息发送到队列中之后,您可从队列中使用它。向队列请求消息时,您无法指定要获取的消息。而应指定要获取的最大消息数量(最多 10 条)。

注意

由于 Amazon SQS 是分布式系统,因此,包含非常少的消息的队列可能会针对接收请求显示空响应。在这种情况下,您可重新运行请求以获取消息。根据您的应用程序的需求,您可能必须使用短轮询或长轮询来接收消息。

Amazon SQS 在为您接收消息之后不会自动删除它,以防您未成功地接收消息 (例如,使用者可能出现故障或者断开连接)。要删除某个消息,您必须发送确认您不再需要该消息(因为您已成功接收并处理它)的单独请求。

以下示例演示了如何接收和删除消息。

AWS 管理控制台

  1. 登录 AWS 管理控制台并通过以下网址打开 Amazon SQS 控制台:https://console.amazonaws.cn/sqs/

  2. 从队列列表中选择一个队列。

  3. 队列操作中,选择,查看/删除消息

    将显示 View/Delete Messages in QueueName 对话框。

    注意

    当您第一次执行此操作时,将会显示一个信息屏幕。要隐藏屏幕,请选中 Don't show this again 复选框。

  4. 选择 Start Polling for messages。

    Amazon SQS 开始轮询队列中的消息。对话框将显示来自队列的消息。对话框底部的进度条显示消息可见性超时的状态。

    以下示例显示特定于 FIFO 队列的 Message Group IDMessage Deduplication IDSequence Number 列。

  5. 在可见性超时过期之前,选择您要删除的消息,然后选择 Delete 1 Message

    将显示 Delete Messages 对话框。

  6. 确认要删除的消息已选中,然后选择 Yes, Delete Checked Messages

    选定的消息已删除。

    当进度栏填满时,可见性超时将过期,消息将变得对使用者可见。

  7. 选择 Close

Java

如需指定要删除的消息,请提供您收到消息时 Amazon SQS 返回的接收句柄。您每个操作只能删除一条消息。要删除整个队列,必须使用 DeleteQueue 操作。(即使队列中包含消息,您也可以删除整个队列。)

注意

如果您没有该消息的接收句柄,可以调用 ReceiveMessage 以再次接收消息。您每次收到消息时都会获得不同的接收句柄。使用 DeleteMessage 操作时,请使用最新的接收句柄。否则,可能无法从队列中删除您的消息。

在您开始处理示例代码之前,请指定 AWS 凭证。有关更多信息,请参阅 AWS SDK for Java Developer Guide 中的设置用于开发的 AWS 凭证和区域

从标准队列接收消息和删除消息

  1. 复制示例程序

    以下部分的代码从您的队列接收消息:

    Copy
    System.out.println("Receiving messages from MyQueue.\n"); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(myQueueUrl); List<Message> messages = sqs.receiveMessage(receiveMessageRequest).getMessages(); for (Message message : messages) { System.out.println(" Message"); System.out.println(" MessageId: " + message.getMessageId()); System.out.println(" ReceiptHandle: " + message.getReceiptHandle()); System.out.println(" MD5OfBody: " + message.getMD5OfBody()); System.out.println(" Body: " + message.getBody()); for (Entry<String, String> entry : message.getAttributes().entrySet()) { System.out.println(" Attribute"); System.out.println(" Name: " + entry.getKey()); System.out.println(" Value: " + entry.getValue()); } } System.out.println();

    以下代码部分将删除消息:

    Copy
    // Delete a message System.out.println("Deleting a message.\n"); String messageReceiptHandle = messages.get(0).getReceiptHandle(); sqs.deleteMessage(new DeleteMessageRequest() .withQueueUrl(myQueueUrl) .withReceiptHandle(messageReceiptHandle));
  2. 编译并运行示例。

    队列被轮询并返回 0 个或多个消息。该示例输出以下项目:

    • 向队列发送消息时您收到的消息 ID.

    • 稍后您用于删除消息的接收句柄

    • 消息正文的 MD5 摘要 (有关更多信息,请参阅 RFC1321)。

    • 消息正文.

    • Amazon SQS 分配给您的请求的请求 ID

    如果此特定调用中没有收到消息,相应就只包含请求 ID。

    消息已删除。该响应包含 Amazon SQS 向您的请求分配的请求 ID。

从 FIFO 队列接收消息和删除消息

  1. 复制示例程序

    以下部分的代码从您的队列接收消息:

    Copy
    // Receive messages System.out.println("Receiving messages from MyFifoQueue.fifo.\n"); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(myQueueUrl); // Uncomment the following to provide the ReceiveRequestDeduplicationId //receiveMessageRequest.setReceiveRequestAttemptId("1"); List<Message> messages = sqs.receiveMessage(receiveMessageRequest).getMessages(); for (Message message : messages) { System.out.println(" Message"); System.out.println(" MessageId: " + message.getMessageId()); System.out.println(" ReceiptHandle: " + message.getReceiptHandle()); System.out.println(" MD5OfBody: " + message.getMD5OfBody()); System.out.println(" Body: " + message.getBody()); for (Entry<String, String> entry : message.getAttributes().entrySet()) { System.out.println(" Attribute"); System.out.println(" Name: " + entry.getKey()); System.out.println(" Value: " + entry.getValue()); } } System.out.println();

    以下代码部分将删除消息:

    Copy
    // Delete the message System.out.println("Deleting the message.\n"); String messageReceiptHandle = messages.get(0).getReceiptHandle(); sqs.deleteMessage(new DeleteMessageRequest(myQueueUrl, messageReceiptHandle));
  2. 编译并运行示例。

    将接收消息,然后将其删除。

本页内容: