Amazon SQS队列发送/接收Java 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的工作方式?我希望能够发送和接收任何数量的信息,我想。

EDIT -我正在使用maxNumberOfMessages并重复长轮询请求,直到队列耗尽(更多关于这里- Amazon SQS长轮询不返回所有消息)

查看ReceiveMessageRequest的API文档,看起来默认情况下每次调用最多检索1条消息。使用new ReceiveMessageRequest().withMaxNumberOfMessages(3)增加这个数字可能会解决您的问题,但是它可能仍然不像您期望的那样工作,因为文档也声明:

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

最新更新