Мы начали работать с Amazon SQS и реализовали абстракцию очереди с помощью фрагментов, предоставленных в документация.
Пока я обнаруживал источник AWS SDK на Github, я обнаружил класс под названием SQSQueue что на 80% то же самое с нашей собственной реализацией.
1 — это где-нибудь задокументировано? (кроме автоматически генерируемого выхода Doxygen)
2 — Единственная дефектная часть предоставленной реализации состоит в том, что она ждет, пока не истечет период опроса, даже если очередь не пуста. Другими словами, если в очереди более одного элемента, он должен продолжать получать сообщения без ожидания периода опроса.
Единственное решение, о котором я могу подумать, — реализовать обратный вызов приема следующим образом:
void messageReceived(const Aws::Queues::Queue<Aws::SQS::Model::Message>* queue, const Aws::SQS::Model::Message& message, bool& deleteMessage)
{
/* Process message */
deleteMessage = true;
auto newMessage = queue->Top();
if (newMessage.GetBody().empty() == false) {
bool deleteNewMessage = false;
messageReceived(queue, newMessage, deleteNewMessage);
if(deleteNewMessage) {
auto nonConstQueue = const_cast<Aws::Queues::Queue<Aws::SQS::Model::Message>*>(queue);
nonConstQueue->Delete(newMessage);
}
}
}
Тем не мение,
а) я ненавижу const_cast.
б) Рекурсивные методы меня пугают.
Есть ли другое решение?
Чтобы ответить на первый вопрос, он нигде не задокументирован. Это утилита высокого уровня SQS, написанная AWS SDK для команды C ++.
Относительно второго вопроса. Я видел похожий PR на Github, чтобы изменить реализацию, чтобы сделать ее более эффективной. Мы рассмотрим слияние как можно скорее.
Других решений пока нет …