java - Amazon SQS 中的消息数

标签 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");

注意:我传的参数中,sqsqUrl都是一样的。

//发送消息方法:

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/

相关文章:

java - 关闭 JFrame 时添加行为

java - 从 servlet 连接到数据库

amazon-web-services - 无法查看/接收来自 AWS SQS 的所有消息

amazon-web-services - 仅在处理完同一主题的 SQS 订阅后才调用 AWS Lambda SNS 事件

Java程序接受输入两次

java - 如何以编程方式在android中使用智能卡读卡器读取智能卡/微处理器卡

django - 在 AWS 中运行 Django Python 服务器

java - AWS SDK - 异步配置的目的 SdkAdvancedAsyncClientOption.FUTURE_COMPLETION_EXECUTOR

amazon-web-services - 使用 nginx 向位于云中的 docker 容器发出 http 请求

java - 堆栈在 ec2 实例上不存在错误,但在本地工作正常