如何从SQS队列中获取所有消息

时间:2019-02-13 13:24:30

标签: java amazon-web-services spring-boot amazon-sqs aws-java-sdk

我正在使用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 :(得分:0)

首先要注意的是:

  1. 按原样使用count,您只阅读约10条消息(由于批量处理,可能会略多一些)。您可能不想在简单的概念验证阶段使用此功能
  2. 使用while (numberOfMessages > 0),只要SQS对消息计数的近似值表明它有消息,您将继续阅读。请注意,这是一个近似值,因此您不应该依赖它是精确的(最终将是一致的)。
  3. 您的getMessageCount()方法看起来像是在每次调用时都试图重新创建队列-虽然可以,但是您不需要这样做。只需创建一次即可使用。

根据我看到的代码,如果(a)您仅拥有大量消息,(b)其他不断向队列添加消息的消息,则getMessageCount()将返回> 1。 c)如果您没有正确删除它们,但是您正在这样做)。

我建议对您的代码进行以下修改:

  1. 每次调用getMessageCount()时记录结果。如果您将消息放入队列的速度比处理消息的速度快,或者有一些消息源永远不会用完,这会给您指示。
  2. 记录您的ReceiveMessageRequest收到的消息数。这会让您知道您确实在处理消息。
  3. 不要将控制流基于getMessageCount()的值,而是继续调用直到ReceiveMessageRequest结果(使用waitTimeSeconds = 20)返回0条消息-这是确保此时您的队列为空的保证(而不是近似值)。