我正在使用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。
有人可以帮我这个忙吗?
答案 0 :(得分:0)
首先要注意的是:
count
,您只阅读约10条消息(由于批量处理,可能会略多一些)。您可能不想在简单的概念验证阶段使用此功能while (numberOfMessages > 0)
,只要SQS对消息计数的近似值表明它有消息,您将继续阅读。请注意,这是一个近似值,因此您不应该依赖它是精确的(最终将是一致的)。 getMessageCount()
方法看起来像是在每次调用时都试图重新创建队列-虽然可以,但是您不需要这样做。只需创建一次即可使用。根据我看到的代码,如果(a)您仅拥有大量消息,(b)其他不断向队列添加消息的消息,则getMessageCount()
将返回> 1
。 c)如果您没有正确删除它们,但是您正在这样做)。
我建议对您的代码进行以下修改:
getMessageCount()
时记录结果。如果您将消息放入队列的速度比处理消息的速度快,或者有一些消息源永远不会用完,这会给您指示。ReceiveMessageRequest
收到的消息数。这会让您知道您确实在处理消息。getMessageCount()
的值,而是继续调用直到ReceiveMessageRequest
结果(使用waitTimeSeconds = 20)返回0条消息-这是确保此时您的队列为空的保证(而不是近似值)。