【发布时间】:2014-02-01 17:02:48
【问题描述】:
我需要在 1 次读取中读取我的 Amazon SQS 队列中的所有消息,然后根据创建的时间戳对其进行排序并对其执行业务逻辑。
为了确保检查所有 SQS 主机的消息,我启用了长轮询。我这样做的方法是将队列的默认等待时间设置为 10 秒。 (任何大于 0 的值都将启用长轮询)。
但是,当我尝试读取队列时,它仍然没有给我所有消息,我必须进行多次读取才能获取所有消息。我什至通过每个接收请求的代码启用了长轮询,仍然没有工作。下面是我正在使用的代码。
AmazonSQSClient sqsClient = new AmazonSQSClient(new ClasspathPropertiesFileCredentialsProvider());
sqsClient.setEndpoint("sqs.us-west-1.amazonaws.com");
String queueUrl = "https://sqs.us-west-1.amazonaws.com/12345/queueName";
ReceiveMessageRequest receiveRequest = new ReceiveMessageRequest().withQueueUrl(queueUrl).withMaxNumberOfMessages(10).withWaitTimeSeconds(20);
List<Message> messages = sqsClient.receiveMessage(receiveRequest).getMessages();
我在队列中有 3 条消息,每次运行代码时都会得到不同的结果,有时我会收到所有 3 条消息,有时只有 1 条。我将可见性超时设置为 2 秒,只是为了消除消息变得不可见作为没有在阅读中看到它们的原因。 这是短轮询的预期行为。长轮询应该消除多次轮询。我在这里做错了什么吗?
谢谢
【问题讨论】:
标签: java amazon-web-services queue long-polling amazon-sqs