我正在尝试学习 Amazon SQS。我正在向我的 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都是一样的。
//发送消息方法:
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 个消息请求。我错过了什么?还是我理解错了?请指正。
最佳答案
默认情况下,ReceiveMessage 只会检索一条消息。您可以传入 MaxNumberOfMessages 选项以在一次调用中检索多条消息。
但是请注意,即使您已将 5 条消息写入队列,即使您将 MaxNumberOfMessages 设置为最大值 10,您也可能无法通过单个 ReceiveMessage 调用将它们全部取回。这是因为SQS 实现保证传递的方式 - 系统实际上会在许多服务器上存储您的消息的许多副本,以确保即使服务器出现故障,您的消息仍能通过。您发布的每条消息都必须在 SQS 系统内跨许多服务器进行复制,而且这种复制不是即时的。这就是为什么消息可能无序到达,为什么 ApproximateNumberOfMessages 是近似值,以及为什么 receiveMessage 可能并不总是返回您期望的那么多消息。乍一看这是违反直觉的,但如果您设计适当的系统,那么在实践中对于许多用例来说并不重要,这就是 SQS 能够提供如此高的可用性和可扩展性的原因。
如果您重复调用 receiveMessage,您将收到所有消息。
关于java - Amazon SQS 中的消息数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16385300/