Неожиданное поведение очереди отправки/получения Amazon SQS с Java SDK — что я делаю неправильно?

Я пытаюсь связать некоторый код Java с очередью SQS, которую я создал на AWS. Я начал с написания теста, чтобы получить желаемое поведение (например, писать и получать сообщения), и, похоже, он ведет себя очень странно. Вот мой тестовый код:

@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 Long Polling не возвращает все сообщения)


person semiserious    schedule 07.09.2015    source источник


Ответы (1)


Глядя на Документы по API для ReceiveMessageRequest похоже, что по умолчанию он получает не более 1 сообщения за вызов. Увеличение этого числа с помощью new ReceiveMessageRequest().withMaxNumberOfMessages(3) может решить вашу проблему, однако оно может по-прежнему работать не так, как вы ожидаете, поскольку в документах также указано:

Если количество сообщений в очереди невелико (менее 1000), скорее всего, вы получите меньше сообщений, чем запрашивали для каждого вызова ReceiveMessage. Если количество сообщений в очереди очень мало, вы можете не получить никаких сообщений в конкретном ответе ReceiveMessage; в этом случае вы должны повторить запрос.

person gar    schedule 07.09.2015
comment
Кроме того, SQS не гарантирует, что порядок поступления будет таким же, как и отправленный заказ (это распределенная очередь), поэтому тест может случайно не пройти. - person Chris; 07.09.2015