2017-01-14 26 views
1

どのようにして受信メッセージが継続的にチェックされますか?次の関数は、メッセージを受け取った後に終了します。キューの長いポーリングが有効になっているため、新しいメッセージを継続的にチェックするにはどうすればよいですか?aws sqsで受信メッセージを確認します

function checkMessage(){ 
    var params = { 
       QueueUrl : Constant.QUEUE_URL, 
       VisibilityTimeout: 0, 
       WaitTimeSeconds: 0 
      } 
    sqs.receiveMessage(params,(err,data) => { 
     if(data){ 
      console.log("%o",data); 
     } 
    }); 
} 

答えて

3

あなたの関数は、引き続きAmazon SQSをポーリングする必要があります。

ロングポーリングは、利用可能なメッセージがない場合、応答を最大20秒遅らせます。その期間中にメッセージが利用可能になると、すぐに返されます。 20秒後にメッセージがない場合は、メッセージを提示せずに戻ります。

したがって、関数はSQSを再度ポーリングする必要があります(その間に何か他の処理をしている可能性があります)。

+0

定期的に同じ機能を呼び出すべきですか? –

+0

はい。メッセージをどのくらい速く処理する必要があるかに応じて、非常に細かい、または5分ごとに呼び出すこともできます。それはあなたの選択です。 –

3
var processMessages = (function (err, data) { 
    if (data.Messages) { 

     for (i = 0; i < data.Messages.length; i++) { 
      var message = data.Messages[i]; 
      var body = JSON.parse(message.Body); 

      // process message 
      // delete if successful 
     } 
    } 
}); 

while (true) { 
    sqs.receiveMessage({ 
     QueueUrl: sqsQueueUrl, 
     MaxNumberOfMessages: 5, // how many messages to retrieve in a batch 
     VisibilityTimeout: 60, // how long until these messages are available to another consumer 
     WaitTimeSeconds: 15  // how many seconds to wait for messages before continuing 
    }, processMessages); 
} 
+0

これはループ内のnodejsアプリケーションを永遠に利用しませんか? –

+0

「どのように私が継続的にチェックできるか」に完全に答えるための説明的なコードとして意味されていました。この場合、各反復で最大15秒間待機します。当然、あなたのユースケースでうまくいくなら、有限の反復でforループを使うことができます。また、SQSメッセージを処理するためにElastic Beanstalkワーカーを選ぶこともできます。http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features-managing-env-tiers.html?shortFooter=true#worker-デーモン –

関連する問題