2012-05-22 51 views
8

默认情况下,boto在消息发送到SQS之前使用Base64对消息进行编码。示例代码:使用boto从Amazon SQS读取原始消息

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

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

rs = q.get_messages(1) 
if rs: 
    m = rs[0] 
    print m.get_body() 

m.get_body()会自动返回解码结果。有没有办法检索原始消息?

谢谢!

回答

3

boto.sqs.queue.Queue构造有message_class的说法,这你可以设置为RawMessage。另一方面,我不明白为什么在传输数据之前不对其进行编码。

+1

谢谢,它的工作原理!我将它用于调试,因为您无法在AWS SQS控制台中查看编码消息。 – eliang

+0

迟到的答案在这里 - 但对于其他人 - 编码消息可以占据消息空间的20%-30%。如果你需要额外的回旋余地来传递更大的信息,那么编码就不会有帮助。 –

7

实际上Message类继承自RawMessage,所以它有它所有的方法。 这些方法之一是:

get_body_encoded()

此方法确实是写消息给SQS的内容时所使用的Queue.write 方法的半私人方法。在正常情况下,您可能不需要调用此方法。

+0

谢谢!不知道有这样一种方法。 – eliang

13

如果您有兴趣只读取SQS队列中的消息并且生产者是其他人,那么在调用get_messages()时可能会开始看到垃圾字符。 再看https://github.com/boto/boto/issues/831

解决方案在这种情况下,是

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

这解释了为什么当我读取从SNS发送给SQS的消息时,我会变得无稽之谈。 – Zenexer

+0

我使用.NET AWSSDK使用正文的字符串将消息放入Q中。用boto拉扯python会产生垃圾,除非你把它作为RawMessage拉出来。好决定! – Skrymsli