1

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

4

4 回答 4

10

默认情况下,ReceiveMessage 只会检索一条消息。您可以传入 MaxNumberOfMessages 选项以在一次调用中检索多条消息。

但是,请注意,即使您已将 5 条消息写入队列,即使您将 MaxNumberOfMessages 设置为最大值 10,也可能无法通过单个 ReceiveMessage 调用将它们全部取回。这是因为 SQS 实现的方式保证交付 - 系统实际上将在许多服务器上存储您的消息的许多副本,以确保即使服务器出现故障,您的消息仍能通过。您发布的每条消息都必须在 SQS 系统中跨多个服务器进行复制,并且该复制不是即时的。这就是为什么消息可能会乱序到达,为什么 ApproximateNumberOfMessages 是近似的,以及为什么 receiveMessage 可能并不总是返回您期望的那么多消息。这起初是违反直觉的,但不是

如果你反复调用receiveMessage,你会收到你所有的消息。

于 2013-05-18T10:37:45.920 回答
7

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

于 2013-05-05T14:37:32.290 回答
0

下面给出了总数:

['ApproximateNumberOfMessages']+['ApproximateNumberOfMessagesDelayed']+['ApproximateNumberOfMessagesNotVisible'];

你可以从PHP 中的 $messageData->get('Attributes')数组中得到这个

于 2019-09-16T10:05:57.580 回答
0
var AWS = require('aws-sdk');

// Set the region 
AWS.config.update({
  region: 'REGION'
});

// Create the SQS service object
var sqs = new AWS.SQS({
    apiVersion: '2012-11-05'
});

// Set params
var params = {
    QueueUrl: queueURL,
    AttributeNames : ['ApproximateNumberOfMessages'],
};

sqs.getQueueAttributes(queParams, function(err, data){
    if (err) {
        console.log("Error", err);
    } else {
        console.log(data);
    }
 });
于 2020-05-07T12:36:59.120 回答