Amazon SQS中的消息数

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)

注意:在我传递的参数中,sqsqUrl都是相同的.

// 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个消息请求.我错过了什么?或者我错误地理解了吗?请指正.

sim*_*onp 9

默认情况下,ReceiveMessage将仅检索单个消息.您可以传入MaxNumberOfMessages选项以在单个调用中检索多个消息.

但是,请注意,即使您已向队列写入五条消息,即使将MaxNumberOfMessages设置为最大值10,也可能无法通过单个ReceiveMessage调用返回所有消息.这是因为SQS实现的方式保证交付 - 系统实际上会在许多服务器上存储许多消息副本,以确保即使服务器出现故障,您的消息仍然可以通过.您发布的每条消息都必须在SQS系统中跨多个服务器进行复制,并且该复制不是即时的.这就是为什么消息可能无序到达,为什么ApproximateNumberOfMessages是近似的,以及为什么receiveMessage可能并不总是返回您期望的消息.这首先是违反直觉的,但如果您将系统设计得恰当,那么在实践中对于许多用例并不重要,而且SQS能够提供如此高的可用性和可扩展性.

如果您反复调用receiveMessage,您将收到所有消息.


Zim*_*oot 7

返回的消息数receiveMessage是不确定的 - 为了获得更可靠的队列大小计数,使用getQueueAttributes和请求ApproximateNumberOfMessages.在此呼叫之前插入一个短暂的延迟,以便让队列有时间处理您发送的消息.

  • 您是否要发送要返回的属性列表?有关示例,请参阅[此主题](https://forums.aws.amazon.com/thread.jspa?threadID=70348) (3认同)