在 Amazon SQS 中设置可见性超时 - Amazon SDK for Java 1.x
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

我们宣布了即将推出 end-of-support 的 Amazon SDK for Java (v1)。建议您迁移到 Amazon SDK for Java v2。有关日期、其他详细信息以及如何迁移的信息,请参阅链接的公告。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 Amazon SQS 中设置可见性超时

为了确保消息接收,在 Amazon SQS 中收到的消息会保留在队列中,直到被删除。在指定的可见性超时时间后,已接收但未删除的消息将可以在后续请求中使用,以帮助防止在对消息进行处理和删除之前重复接收消息。

注意

使用标准队列时,可见性超时无法保证不会接收消息两次。如果您使用的是标准队列,请确保您的代码能够处理多次收到同一条消息的情况。

为单个消息设置消息可见性超时

当您收到消息时,您可以通过在 ChangeMessageVisibilityRequest 中将消息的接收句柄传递到 AmazonSQS 类的 changeMessageVisibility 方法来修改其可见性超时。

导入

import com.amazonaws.services.sqs.AmazonSQS; import com.amazonaws.services.sqs.AmazonSQSClientBuilder;

代码

AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient(); // Get the receipt handle for the first message in the queue. String receipt = sqs.receiveMessage(queue_url) .getMessages() .get(0) .getReceiptHandle(); sqs.changeMessageVisibility(queue_url, receipt, timeout);

请参阅 GitHub 上的完整示例

一次性为多条消息设置的消息可见性超时

要一次性设置多条消息的可见性超时,请创建 ChangeMessageVisibilityBatchRequestEntry 对象的列表,每个对象包含唯一的 ID 和接收句柄。然后将该列表传递给 Amazon SQS 客户端类的 changeMessageVisibilityBatch 方法。

导入

import com.amazonaws.services.sqs.AmazonSQS; import com.amazonaws.services.sqs.AmazonSQSClientBuilder; import com.amazonaws.services.sqs.model.ChangeMessageVisibilityBatchRequestEntry; import java.util.ArrayList; import java.util.List;

代码

AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient(); List<ChangeMessageVisibilityBatchRequestEntry> entries = new ArrayList<ChangeMessageVisibilityBatchRequestEntry>(); entries.add(new ChangeMessageVisibilityBatchRequestEntry( "unique_id_msg1", sqs.receiveMessage(queue_url) .getMessages() .get(0) .getReceiptHandle()) .withVisibilityTimeout(timeout)); entries.add(new ChangeMessageVisibilityBatchRequestEntry( "unique_id_msg2", sqs.receiveMessage(queue_url) .getMessages() .get(0) .getReceiptHandle()) .withVisibilityTimeout(timeout + 200)); sqs.changeMessageVisibilityBatch(queue_url, entries);

请参阅 GitHub 上的完整示例

更多信息