Created
April 27, 2016 14:53
-
-
Save czkimura/978d7bab49f1d59ef627d112f8e9416a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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