2016-05-17 3 views
0

awsアプリケーションのためにnode.jsで書かれたコードがあります。私はJavaとPythonに精通していますが、javascriptには慣れていません。awsのwhileループでメッセージを受信して​​削除します

メッセージがキューに残っているかどうかを確認する必要があります。その場合は、処理して削除する必要があります。しかし、限り、私は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); 

       }); 
      } 
     }); 
    }); 

} 
+0

あなたはそれがためのループの問題ではありませんか、明確にすることはできますか?あなたはwhileループを使っています..何を変更したいのですか? – Shibashis

+0

このwhileループは何らかの形で動作しません(すべてのキュー部分をスキップしてtrueの間に実行されます)。forループを使用してエンドポイントとしてメッセージ番号を設定すると、必要なすべてのメッセージが表示されます。私が見ているすべての投稿は、ループを再帰的またはforループに変更することを示唆しています。 – mehmet

+0

キューには何もメッセージがありませんか?ある時点でメッセージの消費を再開したくないのですか? – Shibashis

答えて

1

私はキューからメッセージを消費するためにいつか書き込んだサンプルコードです。そして、メッセージがないときは、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(); 
+0

本当に私の質問に答えることはありませんが、あなたの時間をありがとうございます – mehmet

+0

あなたの質問はなぜループのdoesntの仕事ですか? – Shibashis

+0

ちょうど1つのメッセージを受け取り、それを処理して、メッセージに従ってインスタンス上で何かを実行したいと思っていました。そして、処理が終了するとすぐに、別のメッセージを取得して同じことをします。 そして、私はなぜループでも動作しないのだろうと思った。 – mehmet

関連する問題