我试图将一些Java代码与我在AWS上制作的SQS队列连接起来。我已经开始编写测试以获得我想要的行为(即编写和接收消息),并且它似乎表现得非常奇怪。这是我的测试代码:
@Test
public void testMessagesAreSentToQueue() {
sqs.sendMessage(queueUrl, "TEST MESSAGE1");
sqs.sendMessage(queueUrl, "TEST MESSAGE2");
sqs.sendMessage(queueUrl, "TEST MESSAGE3");
ReceiveMessageRequest req = new ReceiveMessageRequest().withQueueUrl(queueUrl).withWaitTimeSeconds(20);
List<Message> messagesInQueue = sqs.receiveMessage(req).getMessages();
assertThat(messagesInQueue.size()).isEqualTo(3);
assertThat(messagesInQueue.get(0).getBody()).isEqualTo("TEST MESSAGE1");
assertThat(messagesInQueue.get(1).getBody()).isEqualTo("TEST MESSAGE2");
assertThat(messagesInQueue.get(2).getBody()).isEqualTo("TEST MESSAGE3");
}
现在,如果我注释掉消息2和3,并断言只返回一条消息,则测试通过。但是当我发送多条消息时,测试失败,说messagesInQueue
的大小为1.似乎无论我使用sendMessage
发送了多少条消息,我总是只有一条消息回复receiveMessage().getMessages()
。
我是否误解了SQS的工作方式?我希望能够发送和接收我想要的任意数量的消息。
编辑 - 我正在使用maxNumberOfMessages并重复长轮询请求,直到队列耗尽(此处更多内容为Amazon SQS Long Polling not returning all messages)
答案 0 :(得分:3)
查看API docs for ReceiveMessageRequest,看起来默认情况下每次调用最多可检索1条消息。使用new ReceiveMessageRequest().withMaxNumberOfMessages(3)
增加此数字可能会解决您的问题,但它可能仍无法正常工作,因为文档也说明了这一点:
如果队列中的消息数量很少(小于1000),则可能会获得的消息数量少于每次ReceiveMessage调用所请求的消息数量。如果队列中的消息数量非常小,您可能不会在特定的ReceiveMessage响应中收到任何消息;在这种情况下,您应该重复请求。