SQS接收消息或轮询在无限循环中不工作NodeJs

iaqfqrcu  于 2023-05-28  发布在  Node.js
关注(0)|答案(1)|浏览(118)

我基本上是在玩aws sqs,我想建立一个无限的连接来轮询消息。但是我的函数sqs.recieveMessage不是在无限循环中调用的。有人能帮我吗。我的代码和参数如下:

recieveMessageParams: {
            AttributeNames: [
                "SentTimestamp"
            ],
            MaxNumberOfMessages: 1,
            MessageAttributeNames: [
                "All"
            ],
            QueueUrl: queueURL,
            VisibilityTimeout: 43195,
            WaitTimeSeconds: 20
        }
function sqsReceivemessage(params) {
  while(true) {
    sqs.receiveMessage(params, function (err, data) {
      if (err) {
        console.log("Receive Error", err);
        return err;
      } else if (data) {
        console.log("data recieved")
        let body = JSON.parse(data?.Messages[0].Body);
        let action = data?.Messages[0].MessageAttributes?.action?.StringValue;
        if(action === 'vaxxaEmailAttemptToSend'){
          vaxxaEmailAttemptToSend(body);
        }
        let deleteParams = {
          QueueUrl: queueURL,
          ReceiptHandle: data.Messages[0].ReceiptHandle
        };
        sqs.deleteMessage(deleteParams, function (err, data) {
          if (err) {
            console.log("Delete Error", err);
            return err;
          } else {
            console.log("Message Deleted", data);
            return data;
          }
        });
      }
    });
  }
}
xwbd5t1u

xwbd5t1u1#

我认为您的代码布局将受益于Lambda的重新架构,这也将有助于减少可能的错误代码数量,并更容易隔离代码问题:

  • 我建议使用a lambda instead来执行此操作,因为它会为您处理轮询,并在lambda返回成功时自动从队列中删除消息。这将减少您正在处理的总体代码,并有助于更好地隔离队列传递或代码问题。
  • 我注意到你正在尝试发送电子邮件。请注意,除非您访问Web API来执行此操作,否则Lambda和EC2 restrict outgoing port 25都是如此,因此您可能需要处理此问题。如果你想发送管理员电子邮件之类的东西,使用SNS订阅可能是一个更好的方法。

相关问题