2013-05-05 3 views
0

Я пытаюсь изучить Amazon SQS. Я посылаю несколько запросов сообщений на мою SQS какКоличество сообщений в Amazon SQS

sendMessage(sqs, qUrl, "message 1"); 
    sendMessage(sqs, qUrl, "message 2"); 
    sendMessage(sqs, qUrl, "message 3"); 
    sendMessage(sqs, qUrl, "message 4"); 
    sendMessage(sqs, qUrl, "message 5"); 

Примечание: В параметрах я прохожу, SQS и QUrl все же. Метод

// SendMessage:

public void sendMessage(AmazonSQS sqs, String queueUrl, String msg){ 
     SendMessageRequest smr = new SendMessageRequest(queueUrl, msg); 
     sqs.sendMessage(smr); 
    } 

Но все-таки, когда я пытаюсь сосчитать numberOfRequests в очереди, это 1, а не 5.

public int countRequests(AmazonSQS sqs, String queueUrl){ 
     // Receive messages 
     int numberOfMessages=0; 
     System.out.println("Receiving messages"); 
     ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl); 
     messages = sqs.receiveMessage(receiveMessageRequest).getMessages(); 
     for (Message message : messages) { 
      numberOfMessages++; 
      System.out.println(" Message"); 
      System.out.println(" MessageId:  " + message.getMessageId()); 
      System.out.println(" ReceiptHandle: " + message.getReceiptHandle()); 
      System.out.println(" MD5OfBody:  " + message.getMD5OfBody()); 
      System.out.println(" Body:   " + message.getBody()); 
      for (Entry<String, String> entry : message.getAttributes().entrySet()) { 
       System.out.println(" Attribute"); 
       System.out.println(" Name: " + entry.getKey()); 
       System.out.println(" Value: " + entry.getValue()); 
      } 
     } 
     return numberOfMessages; 
    } 

Здесь,

ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl); 
    messages = sqs.receiveMessage(receiveMessageRequest).getMessages(); 

«сообщения» получить только последнее сообщение, а не первый 4.

Я понимаю, что я должен быть с 5 запросов сообщений в моей очереди. Что я упускаю? Или я понял неправильно? Пожалуйста, поправьте меня.

ответ

5

Число сообщений, возвращаемых receiveMessage, является недетерминированным - чтобы получить более надежный подсчет размера очереди, используйте getQueueAttributes и запросите ApproximateNumberOfMessages. Вставьте короткую задержку перед этим вызовом, чтобы дать время очереди для обработки отправленных сообщений.

+0

Когда я пытаюсь getQueueAttributes, как вы сказали, я вижу "{Атрибуты: {}}" – Prasanna

+3

Вы отправляете список атрибутов, которые хотите вернуть? См. [Эту тему] (https://forums.aws.amazon.com/thread.jspa?threadID=70348) для примера –

5

По умолчанию ReceiveMessage будет получать только одно сообщение. Вы можете передать параметр MaxNumberOfMessages для получения более одного сообщения за один раз.

Однако имейте в виду, что даже если вы написали пять сообщений в очередь, вы можете не вернуть их всех с помощью одного вызова ReceiveMessage, даже если вы установите MaxNumberOfMessages на максимальное значение 10. Это связано с тем, что способ SQS обеспечивает гарантированную доставку - система фактически сохранит много копий вашего сообщения на многих серверах, чтобы гарантировать, что ваше сообщение все равно пройдет, даже если сервер опустится. Каждое отправляемое сообщение должно быть реплицировано в системе SQS на многих серверах, и эта репликация не является мгновенной. Вот почему сообщения могут выходить из строя, почему ApproximateNumberOfMessages является приблизительным и почему receiveMessage может не всегда возвращать столько сообщений, сколько вы ожидаете. Это сначала интригует, но на практике не имеет большого значения для многих случаев использования, если вы проектируете свою систему, и именно так SQS может обеспечить такую ​​высокую доступность и масштабируемость.

Если вы повторно вызываете receiveMessage, вы получите все свои сообщения.

Смежные вопросы