Amazon SQS队列使用Java SDK发送/接收意外行为 - 我做错了什么?

时间:2015-09-07 09:45:19

标签: java amazon-web-services amazon-sqs aws-sdk

我试图将一些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

1 个答案:

答案 0 :(得分:3)

查看API docs for ReceiveMessageRequest,看起来默认情况下每次调用最多可检索1条消息。使用new ReceiveMessageRequest().withMaxNumberOfMessages(3)增加此数字可能会解决您的问题,但它可能仍无法正常工作,因为文档也说明了这一点:

  

如果队列中的消息数量很少(小于1000),则可能会获得的消息数量少于每次ReceiveMessage调用所请求的消息数量。如果队列中的消息数量非常小,您可能不会在特定的ReceiveMessage响应中收到任何消息;在这种情况下,您应该重复请求。