Java SDK 的 Amazon SQS 队列 send/receive 意外行为 - 我做错了什么?

Amazon SQS queue send/receive unexpected behaviour with Java SDK - what am I doing wrong?

我正在尝试将一些 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

查看 API docs for ReceiveMessageRequest 它似乎默认为每次调用最多检索 1 条消息。使用 new ReceiveMessageRequest().withMaxNumberOfMessages(3) 增加此数字可能会解决您的问题,但它可能仍无法按您预期的那样工作,因为文档还指出:

If the number of messages in the queue is small (less than 1000), it is likely you will get fewer messages than you requested per ReceiveMessage call. If the number of messages in the queue is extremely small, you might not receive any messages in a particular ReceiveMessage response; in which case you should repeat the request.