Получить все сообщения от AWS SQS в NodeJS - PullRequest
1 голос
/ 01 мая 2019

У меня есть следующая функция, которая получает сообщение от aws SQS, проблема в том, что я получаю по одному за раз, и я хочу получить их все, потому что мне нужно проверять идентификатор для каждого сообщения:

function getSQSMessages() {

    const params = {
        QueueUrl: 'some url',
    };

    sqs.receiveMessage(params, (err, data) => {
        if(err) {
            console.log(err, err.stack)
            return(err);
        }
        return data.Messages;
    });

};

function sendMessagesBack() {

    return new Promise((resolve, reject) => {
        if(Array.isArray(getSQSMessages())) {
            resolve(getSQSMessages());
        } else {
            reject(getSQSMessages());
        };
    });

};

Функция sendMessagesBack () используется в другой функции async / await. Я не уверен, как получить все сообщения, так как я искал, как их получить, люди упоминают циклы, но я не мог понять, как реализовать это в моем случае. Я предполагаю, что должен поместить sqs.receiveMessage () в цикл, но потом я запутался в том, что мне нужно проверять и когда останавливать цикл, чтобы я мог получить идентификатор каждого сообщения?

Если у кого-нибудь есть советы, поделитесь. Спасибо.

Ответы [ 3 ]

2 голосов
/ 01 мая 2019

SQS не возвращает более 10 сообщений в ответе.Чтобы получить все доступные сообщения, вам нужно рекурсивно вызвать функцию getSQSMessages.Если вы возвращаете обещание от getSQSMessages, вы можете сделать что-то вроде этого.

getSQSMessages()
.then(data => {
  if(!data.Messages || data.Messages.length === 0){
      // no messages are available. return
  }
  // continue processing for each message or push the messages into array and call 
 //getSQSMessages function again. 
});
2 голосов
/ 01 мая 2019

Я предлагаю вам использовать API Promise, и это даст вам возможность сразу использовать синтаксис async / await.

const { Messages } = await sqs.receiveMessage(params).promise();
// Messages will contain all your needed info
await sqs.sendMessage(params).promise();

Таким образом, вам не нужно будет переноситьAPI обратного вызова с Promises.

1 голос
/ 01 мая 2019

Вы не можете гарантировать получение всех сообщений в очереди, если только после получения некоторых из них вы не удалите их из очереди - таким образом гарантируя, что при следующих запросах будет получен другой выбор записей.

Каждый запрос вернет «до» 10 сообщений, если вы не удалите их, то есть большая вероятность, что следующий запрос на «до» 10 сообщений вернет набор сообщений, которые вы уже видели, а некоторые новые - так что вы никогда не узнаете, когда увидели их все.

Возможно, что очередь не тот инструмент, который нужно использовать в вашем случае использования - но, поскольку я не знаю ваш вариант использования, трудно сказать.

...