Amazon SQS中的消息数

时间:2013-05-05 14:02:10

标签: java amazon-web-services amazon-sqs

我正在尝试学习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个消息请求。我错过了什么?或者我错误地理解了吗?请纠正我。

4 个答案:

答案 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]);
 }