2012-05-22 115 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