默认情况下,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)
通过将Raw()替换为RawMessage(),我可以将原始消息发送到队列而不进行编码。但是如何在不解码的情况下从队列中读取消息?如果我使用以下代码:
rs = q.get_messages(1)
if rs:
m = rs[0]
print m.get_body()
m.get_body()自动返回解码结果。有没有办法检索原始邮件?
谢谢!
答案 0 :(得分:14)
如果您只想阅读SQS队列中的消息并且生产者是其他人,则在调用get_messages()时可能会开始看到垃圾字符。 见https://github.com/boto/boto/issues/831
在这种情况下再次解决方案是
from boto.sqs.message import RawMessage
q.set_message_class(RawMessage)
答案 1 :(得分:7)
实际上Message
类继承自RawMessage
,所以它拥有所有方法。
其中一种方法是:
<强> get_body_encoded()
强>
此方法实际上是Queue.write使用的半私有方法 将消息内容写入SQS时的方法。你可能 不应该在正常的事件过程中调用此方法。
答案 2 :(得分:3)
boto.sqs.queue.Queue
的构造函数有一个message_class
参数,您可以将其设置为RawMessage
。另一方面,我不明白为什么在传输之前不对数据进行编码是有意义的。