【问题标题】:How to tell if boto.sqs.Queue.write() succeeded?如何判断 boto.sqs.Queue.write() 是否成功?
【发布时间】:2014-01-13 17:10:23
【问题描述】:

我能找到的有关此方法的所有文档都说 Queue.write 返回 True 或 False,具体取决于写入是否成功,但这与现实不符。

文档说:

如果一切顺利,write 方法会返回 True。如果写 没有成功它会返回一个 False (意味着 SQS 只是选择了 出于某种原因不写消息)或例外,如果有 请求存在某种问题。

但实际上该方法只是简单地返回传入的消息。这是来自https://github.com/boto/boto/blob/develop/boto/sqs/queue.py的相关源代码:

def write(self, message, delay_seconds=None):
    """
    Add a single message to the queue.
    :type message: Message
    :param message: The message to be written to the queue

    :rtype: :class:`boto.sqs.message.Message`
    :return: The :class:`boto.sqs.message.Message` object that was written.
    """
    new_msg = self.connection.send_message(self,
                                           message.get_body_encoded(),
                                           delay_seconds)
    message.id = new_msg.id
    message.md5 = new_msg.md5
    return message

那么我的问题是:我如何真正判断写入是否成功?

【问题讨论】:

    标签: python amazon-web-services boto amazon-sqs


    【解决方案1】:

    您提供的文档引用来自 SQS 教程。 SQS API docs 正确描述了当前的返回值。 SQS 教程已经过时,需要更正。我创建了一个issue 来跟踪它。

    如果写入因任何原因失败,服务将返回一个 HTTP 错误代码,进而导致 boto 引发 SQSError 异常。如果没有引发异常,则写入成功。

    【讨论】:

    • 谢谢,非常有帮助。 Boto 方法是否会引发异常而不是返回错误?我没有看到您链接的文档中提到了异常。
    • 是的,通常是这样。由于大多数 API 调用在服务之间是相似的,因此进行调用的实际代码在模块之间共享。所有的亚马逊网络服务都使用 HTTP 错误代码来传达状态。因此 boto 检查那些 HTTP 响应代码并在检测到错误时引发 Python 异常。我们应该更好地记录可以引发的异常。
    猜你喜欢
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多