在 Amazon SQS 中设置可见性超时 - AWS SDK for Java 1.x

自2024年7月31日起, AWS SDK for Java 1.x已进入维护模式,并将于2025年12月31日end-of-support上线。我们建议您迁移到AWS SDK for Java 2.x以继续接收新功能、可用性改进和安全更新。

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

在 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 上的完整示例

更多信息