Pra*_*nna 1 java amazon-sqs amazon-web-services
我正在尝试学习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");
Run Code Online (Sandbox Code Playgroud)
注意:在我传递的参数中,sqs和qUrl都是相同的.
// sendMessage方法:
public void sendMessage(AmazonSQS sqs, String queueUrl, String msg){
SendMessageRequest smr = new SendMessageRequest(queueUrl, msg);
sqs.sendMessage(smr);
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试计算队列中的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;
}
Run Code Online (Sandbox Code Playgroud)
在这里,
ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl);
messages = sqs.receiveMessage(receiveMessageRequest).getMessages();
Run Code Online (Sandbox Code Playgroud)
"messages"只接收最后一条消息而不是前4条消息.
我的理解是我的队列中应该有5个消息请求.我错过了什么?或者我错误地理解了吗?请指正.
默认情况下,ReceiveMessage将仅检索单个消息.您可以传入MaxNumberOfMessages选项以在单个调用中检索多个消息.
但是,请注意,即使您已向队列写入五条消息,即使将MaxNumberOfMessages设置为最大值10,也可能无法通过单个ReceiveMessage调用返回所有消息.这是因为SQS实现的方式保证交付 - 系统实际上会在许多服务器上存储许多消息副本,以确保即使服务器出现故障,您的消息仍然可以通过.您发布的每条消息都必须在SQS系统中跨多个服务器进行复制,并且该复制不是即时的.这就是为什么消息可能无序到达,为什么ApproximateNumberOfMessages是近似的,以及为什么receiveMessage可能并不总是返回您期望的消息.这首先是违反直觉的,但如果您将系统设计得恰当,那么在实践中对于许多用例并不重要,而且SQS能够提供如此高的可用性和可扩展性.
如果您反复调用receiveMessage,您将收到所有消息.
返回的消息数receiveMessage是不确定的 - 为了获得更可靠的队列大小计数,使用getQueueAttributes和请求ApproximateNumberOfMessages.在此呼叫之前插入一个短暂的延迟,以便让队列有时间处理您发送的消息.
| 归档时间: |
|
| 查看次数: |
8990 次 |
| 最近记录: |