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

eli*_*ang 8 python boto amazon-sqs amazon-web-services

默认情况下,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)
Run Code Online (Sandbox Code Playgroud)

通过将Raw()替换为RawMessage(),我可以将原始消息发送到队列而无需编码.但是如何在不解码的情况下从队列中读取消息?如果我使用以下代码:

rs = q.get_messages(1)
if rs:
    m = rs[0]
    print m.get_body()
Run Code Online (Sandbox Code Playgroud)

m.get_body()自动返回解码结果.有没有办法检索原始邮件?

谢谢!

kk1*_*957 14

如果您只想阅读SQS队列中的消息并且生产者是其他人,则在调用get_messages()时可能会开始看到垃圾字符.请参阅https://github.com/boto/boto/issues/831

在这种情况下再次解决的问题是

from boto.sqs.message import RawMessage
q.set_message_class(RawMessage)
Run Code Online (Sandbox Code Playgroud)


var*_*tec 7

实际上Message类继承自RawMessage,所以它拥有所有的方法.其中一种方法是:

get_body_encoded()

在将消息内容写入SQS时,此方法实际上是Queue.write方法使用的半私有方法.您可能不需要在正常的事件过程中调用此方法.


Jan*_*cke 4

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