为 Amazon SQS 消息队列启用长轮询 - 适用于 Java 的 AWS 软件开发工具包
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

为 Amazon SQS 消息队列启用长轮询

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

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

注意

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

创建队列时启用长轮询

要在创建 Amazon SQS 队列时启用长轮询,请在 ReceiveMessageWaitTimeSecondsCreateQueueRequest 对象上设置 属性,然后再调用 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 上的完整示例

在现有队列上启用长轮询

除了在创建队列时启用长轮询之外,您还可以通过在 ReceiveMessageWaitTimeSecondsSetQueueAttributesRequest 上设置 来在现有队列上启用长轮询,然后再调用 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 上的完整示例

在接收消息时启用长轮询

您可以在接收消息时启用长轮询,方法是在 ReceiveMessageRequest 上设置您提供给 AmazonSQS 类的 receiveMessage 方法的等待时间(以秒为单位)。

注意

您应确保 AWS 客户端的请求超时时间大于最大长轮询时间 (20 秒),以确保您的 receiveMessage 请求在等待下一轮询事件时不会超时!

导入

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

代码

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

请参阅 GitHub 上的完整示例

更多信息

  • 中的 Amazon SQS 长轮询Amazon SQS Developer Guide

  • 中的 CreateQueueAmazon SQS API Reference

  • 中的 ReceiveMessageAmazon SQS API Reference

  • 中的 SetQueueAttributesAmazon SQS API Reference