【发布时间】: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