Как получить все сообщения из очереди SQS - PullRequest
0 голосов
/ 13 февраля 2019

Я использую SQS для чтения данных.Но я не уверен, как читать все данные из очереди.

public List<Customer> getMessage() {


 int numberOfMessages= getMessageCount();
 System.out.println(numberOfMessages);
 int count=0;
 while(count<10) {

     System.out.println("Messages remaining in the queue- 
 >>>"+numberOfMessages);
     System.out.println("Recieving Messages from the Queue: ");
        final ReceiveMessageRequest receiveMessageRequest =
        new ReceiveMessageRequest(queueURL)
        .withMaxNumberOfMessages(10)
        .withWaitTimeSeconds(20);

        final List<com.amazonaws.services.sqs.model.Message> customers =   
                  sqs.receiveMessage(receiveMessageRequest).getMessages();


        for(com.amazonaws.services.sqs.model.Message cust: customers) {
            System.out.println("Current message number->>>>>"+(count+1));
            System.out.println(cust.getBody());
            sqs.deleteMessage(new DeleteMessageRequest(queueURL,
                    cust.getReceiptHandle()));
            count++;
        }

        //numberOfMessages=getMessageCount();

 }
 return null;

 }

public int getMessageCount() {
    Set<String> attrs = new HashSet<String>();
     attrs.add("ApproximateNumberOfMessages");
     CreateQueueRequest createQueueRequest = new CreateQueueRequest().withQueueName("sampleQueueSharma");
     GetQueueAttributesRequest a = new GetQueueAttributesRequest().withQueueUrl(sqs.createQueue(createQueueRequest).getQueueUrl()).withAttributeNames(attrs);
     Map<String,String> result = sqs.getQueueAttributes(a).getAttributes();
     int num = Integer.parseInt(result.get("ApproximateNumberOfMessages"));
     return num;
    }

Я читаю данные таким образом, но это кажется неправильным.

Я также пытался заменить while(count<10) с while(numberOfMessages>0) и раскомментированием numberOfMessages=getMessageCount() этой строки, но при этом код выполняется бесконечно.Кажется, он всегда возвращает значение больше 1.

Может ли кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 14 февраля 2019

Сначала несколько примечаний:

  1. Используя count, как вы, вы читаете только около 10 сообщений (может быть, немного больше из-за пакетирования).Вы, вероятно, не хотите использовать это после простого этапа проверки концепции
  2. Используя while (numberOfMessages > 0), вы будете продолжать читать, пока приближенное к SQS количество сообщений говорит, что у него есть сообщения.Обратите внимание, что это приблизительное значение, поэтому не следует полагаться на его точность (в конечном итоге это будет согласованно).
  3. Ваш метод getMessageCount() выглядит так, как будто он пытается воссоздать очередь каждый раз, когда он вызывается - пока это будет работать, вам не нужно этого делать.Создайте его один раз и просто используйте.

Исходя из кода, который я вижу, getMessageCount() вернет > 1, если (а) у вас просто куча сообщений, (б) что-то ещепостоянно добавляет сообщения в очередь (или (с), если вы не удаляете их должным образом, но делаете это).

Я бы предложил следующие модификации вашего кода:

  1. Записывайте результат getMessageCount() каждый раз, когда он вызывается.Это даст вам указание, если вы помещаете сообщения в свою очередь быстрее, чем вы можете их обработать, или у вас есть какой-либо источник сообщений, который никогда не закончится.
  2. Записывайте количество сообщений, полученных вашим ReceiveMessageRequest.Это даст вам знать, что вы действительно обрабатываете сообщения.
  3. Вместо того, чтобы основывать свой поток управления на значении getMessageCount(), продолжайте вызывать до тех пор, пока ReceiveMessageRequest результат (с waitTimeSeconds = 20) не вернет 0 сообщений - этогарантия того, что ваша очередь в этот момент пуста (вместо приблизительного значения).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...