【问题标题】:NodeJS sqs-consumer keeps executing functionNodeJS sqs-consumer 不断执行函数
【发布时间】:2023-02-09 22:13:22
【问题描述】:

我使用 npm 包:sqs-consumer 来轮询队列中的消息。每当收到新消息时,我希望它在 S3 存储桶中创建一个子文件夹。我遇到的问题是,即使在收到消息然后从队列中删除后,该功能仍在执行,这会创建 100 个子文件夹。每封邮件我只想要一个子文件夹。

这是S3存储桶功能

const createSubDirectory = (s3BucketName, s3ObjectKey) => {
  var params = { Bucket: `${s3BucketName}`, Key: `${s3ObjectKey}`, ACL: "public-read", Body: "body does not matter" };

  try {
    s3.putObject(params);
    console.log("Error creating the folder: ", err);
  } catch (e) {
    console.log(`Subdirectory successfully created: ${s3BucketName}/${s3ObjectKey}`);
  }
};

下面是我的主要功能:

const app = Consumer.create({
    queueUrl: process.env.SQS_QUEUE_URL,
    WaitTimeSeconds: 20,
    VisibilityTimeout: 600, // 10 min wait time for anyone else to process.
    shouldDeleteMessages: true,
    batchSize: 1,
    pollingWaitTimeMs: 10000,
    messageAttributeNames: ["All"],
    handleMessage: (message) => {
      let event = JSON.parse(message.Body);
      console.log(event);
      sqs.receiveMessage(
        {
          MaxNumberOfMessages: 1,
          MessageAttributeNames: ["All"],
          QueueUrl: process.env.SQS_QUEUE_URL,
        },
        function (err, data) {
          if (err) {
            console.log("Receive Error", err);
          } else {
            console.log("-------------- MESSAGE RECEIVED -------------");
             
            let s3ObjectKey = `${parentDirectory}/${AWS.util.uuid.v4()}/`
            createSubDirectory(s3BucketName, s3ObjectKey);

            sqs.deleteMessage({ QueueUrl: process.env.SQS_QUEUE_URL, ReceiptHandle: message.ReceiptHandle }, function (err, data) {
                if (err) {
                  console.log("Delete Error", err);
                } else {
                  console.log("Message Deleted: ", data.ResponseMetadata.RequestId);
                }
              });
          }
        }
      );
    },
    sqs: new AWS.SQS({
      apiVersion: "2012-11-05",
      region: "us-east-1",
      httpOptions: {
        agent: new https.Agent({
          keepAlive: true,
        }),
      },
    }),
  });

  app.on("error", (err) => {
    console.error(err.message);
  });

  app.on("processing_error", (err) => {
    console.error(err.message);
  });

  app.start();

【问题讨论】:

    标签: javascript node.js amazon-sqs


    【解决方案1】:

    在 handleMessage 处理程序中,您无需调用sqs.receiveMessage 消息及其内部方法。 无需设置 batchSize,因为它默认一次处理一条消息。

    只需将您的创建目录代码放在 handleMessage 中。

    我希望它能解决你的问题。

    【讨论】:

      猜你喜欢
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 2022-06-12
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      相关资源
      最近更新 更多