使用boto从Amazon SQS读取原始消息

9

默认情况下,boto在将消息发送到SQS之前,会使用Base64对消息进行编码。以下是示例代码:

conn = boto.connect_sqs('access_key_id', 'secret_key') 
q = conn.get_queue('myqueue')
m = Message()
m.set_body('hello!')
q.write(m)

通过将Message()替换为RawMessage(),我可以发送未编码的原始消息到队列中。但是如何在不解码的情况下从队列中读取消息?如果我使用以下代码:
rs = q.get_messages(1)
if rs:
    m = rs[0]
    print m.get_body()

m.get_body()自动返回解码结果。有没有一种方法可以检索原始消息?

谢谢!

3个回答

14

如果你只是想读取SQS队列中的消息,而生产者是别人,当调用get_messages()时可能会看到垃圾字符。

请参见https://github.com/boto/boto/issues/831

在这种情况下的解决办法是:

from boto.sqs.message import RawMessage
q.set_message_class(RawMessage)

这就解释了为什么我从SNS发送的消息读取SQS时会得到无意义的内容。 - Zenexer
我使用 .NET AWSSDK 将消息放入 Q,使用字符串作为正文。用 boto 在 Python 中拉取它会产生垃圾,除非你将其作为 RawMessage 拉取。做得好! - Skrymsli

7

实际上,Message类继承自RawMessage,因此它具有所有的方法。

其中之一是:

get_body_encoded()

当将消息内容写入SQS时,Queue.write方法会使用此方法进行半私有的处理。在正常情况下,您可能不需要调用此方法。


谢谢!我不知道有这样的方法。 - eliang

4
boto.sqs.queue.Queue的构造函数有一个message_class参数,可以设置为RawMessage。但是,我不明白为什么在传输数据之前不对其进行编码是有意义的。

1
谢谢,它有效!我用它来调试,因为在AWS SQS控制台中无法查看编码消息。 - eliang
回答晚了,但是对于其他人来说,编码消息可能会占用你的消息空间的20%至30%。如果您需要更大的消息容量,不进行编码可能会有所帮助。 - L-R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接