在aws上的while循环中接收和删除消息

时间:2016-05-17 23:45:48

标签: javascript node.js amazon-web-services

对于aws应用程序,我有一个用node.js编写的代码。我熟悉java和python但不熟悉javascript。

我需要检查队列中是否有任何消息,如果是,我需要处理它们然后删除。但据我所知,while循环不会等待我的队列进程而只是运行。过了一段时间,它耗尽了我的记忆。

如果我用for循环那么没有问题,但我必须用while循环这样做,所以有没有办法使用while循环呢?

message_count = true;



while (message_count === true)
{
    queue.getQueueAttributes(params_queue, function (err, data)
    {
        if (err)
            console.log(err, err.stack);
        else
            console.log(data);
        if (data.Attributes.ApproximateNumberOfMessages == "0")
        {
            message_count = false;
        }
        queue.receiveMessage(function (err, data)
        {
            if (data)
            {
                message = data.Messages[0].Body
                receipthandle = data.Messages[0].ReceiptHandle;
                params.ReceiptHandle = receipthandle
                queue.deleteMessage(params, function (err, data)
                {
                    if (err)
                        console.log(err, err.stack);
                    else
                        console.log(data);

                });
            }
        });
    });

}

1 个答案:

答案 0 :(得分:4)

以下是我在某个时候写的一些示例代码,用于使用队列中的消息。如果没有消息,请在延迟1分钟后重试。

var AWS = require('aws-sdk');

AWS.config.loadFromPath('./config.json');
AWS.config.update({region: 'us-east-1'});
var sqs = new AWS.SQS();
var sqsQueueURl = "<queueurl>";

var receiveMessageParams = {
    QueueUrl : sqsQueueURl,
    MaxNumberOfMessages : 10,
    VisibilityTimeout : 10,
    WaitTimeSeconds : 10
};

var receiveMessage = function() {
    sqs.receiveMessage(receiveMessageParams, function(err, data) {
        if(err){
            console.log(err);
            }
        if (data.Messages) {
            for (var i = 0; i < data.Messages.length; i++) {
                var message = data.Messages[i];
                var body = JSON.parse(message.Body);
                // execute logic
                removeFromQueue(message);
            }
            receiveMessage();
        } else {
            setTimeout(function() {
                receiveMessage()
            }, 60 * 1000);

        }
    });
};

var removeFromQueue = function(message) {
    sqs.deleteMessage({
        QueueUrl : sqsQueueURl,
        ReceiptHandle : message.ReceiptHandle
    }, function(err, data) {
        err && console.log(err);
    });
};


receiveMessage();