Skip to content

Instantly share code, notes, and snippets.

@czkimura
Created April 27, 2016 14:53
Show Gist options
  • Save czkimura/978d7bab49f1d59ef627d112f8e9416a to your computer and use it in GitHub Desktop.
Save czkimura/978d7bab49f1d59ef627d112f8e9416a to your computer and use it in GitHub Desktop.
'use strict'
const AWS = require('aws-sdk');
// SQS の QueueName
const SQS_QUEUE_NAME = 'testQueue'
// 最大で取りたいメッセージ数
const SQS_RECEIVE_LIMIT = 100;
// receiveMessage メソッドの params.MaxNumberOfMessages に渡す数(1 〜 10)
const SQS_RECEIVE_MESSAGE_MAX = 10;
exports.handler = (event, context) => {
console.log('event', event);
let queueUrl;
const sqs = new AWS.SQS();
const promiseCB = (resolve, reject) => {
return (err, result) => {
if (err) {
reject(err);
return ;
}
resolve(result);
}
}
const throughP = (result) => {
return new Promise((resolve, reject) => {
resolve(result);
});
}
const createP = (params) => {
return new Promise((resolve, reject) => {
sqs.createQueue(params, promiseCB(resolve, reject));
});
}
const checkSizeP = (params) => {
return new Promise((resolve, reject) => {
sqs.getQueueAttributes(params, promiseCB(resolve, reject));
});
}
const recieveMessagesP = (params) => {
return new Promise((resolve, reject) => {
sqs.receiveMessage(params, promiseCB(resolve, reject));
});
}
createP({
QueueName: SQS_QUEUE_NAME
}).then((result) => {
console.log('createP', result);
queueUrl = result.QueueUrl
return checkSizeP({
QueueUrl: queueUrl,
AttributeNames: [
'ApproximateNumberOfMessages',
]
});
}).then((result) => {
console.log('checkSizeP', result);
if (result.Attributes.ApproximateNumberOfMessages === '0') {
return throughP(result);
}
const receiveLimit = Math.min(SQS_RECEIVE_LIMIT, parseInt(result.Attributes.ApproximateNumberOfMessages, 10));
const loop = Math.ceil(receiveLimit / SQS_RECEIVE_MESSAGE_MAX);
return Promise.all(
new Array(loop)
.fill(0)
.map((v, i) => {
return recieveMessagesP({
QueueUrl: queueUrl,
MaxNumberOfMessages: SQS_RECEIVE_MESSAGE_MAX,
});
})
);
}).then((result) => {
const messages = result.reduce((prev, res) => {
return prev.concat(res.Messages);
}, []);
return throughP(messages.filter((v) => {
return (v instanceof Object) && v.Body
}));
}).then((result) => {
console.log('context.done', result);
context.done(null, result);
}).catch((err) => {
console.error(err);
context.done(err);
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment