

 适用于 Java 的 Amazon SDK 1.x 已于 2025 年 12 月 31 日终止支持。我们建议您迁移到 [Amazon SDK for Java 2.x](https://docs.amazonaws.cn/sdk-for-java/latest/developer-guide/home.html) 以继续获得新功能、可用性改进和安全更新。

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

# 为 Amazon SQS 消息队列启用长轮询
<a name="examples-sqs-long-polling"></a>

 默认情况下，Amazon SQS 使用*短轮询*，此时仅查询服务器的一个子集（基于加权随机分布），以确定是否有任何消息可包含在响应中。

长轮询有助于降低使用 Amazon SQS 的费用，它可在答复发送到 Amazon SQS 队列的 ReceiveMessage 请求时，减少因没有消息可返回而造成的空响应数，还可消除假的空响应。

**注意**  
您可以设置 *1 到 20 秒*的长轮询频率。

## 创建队列时启用长轮询
<a name="sqs-long-polling-create-queue"></a>

要在创建 Amazon SQS 队列时启用长轮询，请设置 [CreateQueueRequest](https://docs.amazonaws.cn/sdk-for-java/v1/reference/com/amazonaws/services/sqs/model/CreateQueueRequest.html) 对象的 `ReceiveMessageWaitTimeSeconds` 属性，然后再调用 AmazonSQS 类的 `createQueue` 方法。

 **导入**。

```
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
import com.amazonaws.services.sqs.model.AmazonSQSException;
import com.amazonaws.services.sqs.model.CreateQueueRequest;
```

 **代码** 

```
final AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();

// Enable long polling when creating a queue
CreateQueueRequest create_request = new CreateQueueRequest()
        .withQueueName(queue_name)
        .addAttributesEntry("ReceiveMessageWaitTimeSeconds", "20");

try {
    sqs.createQueue(create_request);
} catch (AmazonSQSException e) {
    if (!e.getErrorCode().equals("QueueAlreadyExists")) {
        throw e;
    }
}
```

请参阅 GitHub 上的[完整示例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/sqs/src/main/java/aws/example/sqs/LongPolling.java)。

## 在现有队列上启用长轮询
<a name="sqs-long-polling-existing-queue"></a>

除了在创建队列时启用长轮询之外，您也可以通过在 [SetQueueAttributesRequest](https://docs.amazonaws.cn/sdk-for-java/v1/reference/com/amazonaws/services/sqs/model/SetQueueAttributesRequest.html) 上设置 `ReceiveMessageWaitTimeSeconds`，然后再调用 AmazonSQS 类的 `setQueueAttributes` 方法，在现有队列上启用长轮询。

 **导入**。

```
import com.amazonaws.services.sqs.model.SetQueueAttributesRequest;
```

 **代码** 

```
SetQueueAttributesRequest set_attrs_request = new SetQueueAttributesRequest()
        .withQueueUrl(queue_url)
        .addAttributesEntry("ReceiveMessageWaitTimeSeconds", "20");
sqs.setQueueAttributes(set_attrs_request);
```

请参阅 GitHub 上的[完整示例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/sqs/src/main/java/aws/example/sqs/LongPolling.java)。

## 在接收消息时启用长轮询
<a name="sqs-long-polling-receive-message"></a>

您可以在接收消息时启用长轮询，方法是在您提供给 AmazonSQS 类的 `receiveMessage` 方法的 [ReceiveMessageRequest](https://docs.amazonaws.cn/sdk-for-java/v1/reference/com/amazonaws/services/sqs/model/ReceiveMessageRequest.html) 中设置等待时间（以秒为单位）。

**注意**  
您应确保 Amazon 客户端的请求超时时间大于最大长轮询时间（20 秒），以确保您的 `receiveMessage` 请求在等待下一轮询事件时不会超时！

 **导入**。

```
import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
```

 **代码** 

```
ReceiveMessageRequest receive_request = new ReceiveMessageRequest()
        .withQueueUrl(queue_url)
        .withWaitTimeSeconds(20);
sqs.receiveMessage(receive_request);
```

请参阅 GitHub 上的[完整示例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/sqs/src/main/java/aws/example/sqs/LongPolling.java)。

## 更多信息
<a name="more-info"></a>
+  《Amazon SQS Developer Guide》中的 [Amazon SQS Long Polling](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-long-polling.html)
+  《Amazon SQS API Reference》中的 [CreateQueue](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/APIReference/API_CreateQueue.html)
+  《Amazon SQS API Reference》中的 [ReceiveMessage](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html)
+  《Amazon SQS API Reference》中的 [SetQueueAttributes](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html)