Amazon Sqs 队列抽象
Amazon Sqs Queue abstraction
我们已经开始使用 Amazon SQS,并借助 documentation 中提供的代码片段实施了队列抽象。
当我在 Github 上发现 AWS SDK 源代码时,我发现了一个名为 SQSQueue 的 class,它与我们自己的实现有 %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);
}
}
}
然而,
a) 我讨厌 const_cast.
b) 递归方法让我害怕。
还有其他解决办法吗?
为了回答你的第一个问题,它没有在任何地方记录。它是由 AWS SDK 为 C++ 团队编写的 SQS 高级实用程序。
关于第二个问题。我在 Github 上看到过类似的 PR 来修改实现以使其更有效。我们会考虑尽快合并。
我们已经开始使用 Amazon SQS,并借助 documentation 中提供的代码片段实施了队列抽象。
当我在 Github 上发现 AWS SDK 源代码时,我发现了一个名为 SQSQueue 的 class,它与我们自己的实现有 %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);
}
}
}
然而,
a) 我讨厌 const_cast.
b) 递归方法让我害怕。
还有其他解决办法吗?
为了回答你的第一个问题,它没有在任何地方记录。它是由 AWS SDK 为 C++ 团队编写的 SQS 高级实用程序。
关于第二个问题。我在 Github 上看到过类似的 PR 来修改实现以使其更有效。我们会考虑尽快合并。