我正在尝试学习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 都是一样的。
// sendMessage方法:
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();
&#34;消息&#34; 仅接收最后一条消息,而不是前4条消息。
我的理解是我的队列中应该有5个消息请求。我错过了什么?或者我错误地理解了吗?请纠正我。
答案 0 :(得分:9)
默认情况下,ReceiveMessage只会检索单个邮件。您可以传入MaxNumberOfMessages选项,以便在一次调用中检索多条消息。
但是,请注意,即使您已将五条消息写入队列,即使将MaxNumberOfMessages设置为最大值10,也可能无法通过单个ReceiveMessage调用返回所有消息。这是因为SQS实现有保证的交付方式 - 系统实际上会在许多服务器上存储许多消息副本,以确保即使服务器出现故障,您的消息仍然可以通过。您发布的每条消息都必须在SQS系统中跨多个服务器进行复制,并且该复制不是即时的。这就是为什么消息可能无序到达,为什么ApproximateNumberOfMessages是近似的,以及为什么receiveMessage可能并不总是返回您期望的消息。这首先是违反直觉的,但如果您的系统设计合适,那么在实践中对于许多用例并不重要,而且SQS能够提供如此高的可用性和可扩展性。
如果您反复拨打receiveMessage,您将收到所有消息。
答案 1 :(得分:7)
receiveMessage
返回的消息数量是不确定的 - 要获得更可靠的队列大小计数,请使用getQueueAttributes
并请求ApproximateNumberOfMessages
。在此调用之前插入一个短暂的延迟,以便让队列有时间处理您发送的消息。
答案 2 :(得分:0)
以下给出了总数:
['roximateNumberofMessages'] + ['roximatenumberofMessagesdelayed'] + ['roximatenumberofmessnotsvisible'];
您可以从PHP中的 $ messageData-> get('Attributes')数组中获得
答案 3 :(得分:0)
protected function validateLogin(Request $request)
{
$this->validate(['email'=>new \CheckCompany, 'password'=>
'required]);
}