2012-05-22 23 views
8

デフォルトでは、メッセージは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) 

Message()をRawMessage()に置き換えると、未処理のメッセージをエンコードせずにキューに送信できます。しかし、どのように私はデコードせずにキューからメッセージを読むのですか?次のコードを使用すると:

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

m.get_body()はデコードされた結果を自動的に返します。生のメッセージを取得する方法はありますか?

ありがとうございます!

答えて

3

boto.sqs.queue.Queueのコンストラクタは、あなたがRawMessageに設定することができmessage_class引数を持っています。一方、私はそれを伝える前にそのデータを符号化しないことが理にかなっているのはなぜか分かりません。

+1

ありがとう、それは動作します! AWS SQSコンソールでエンコードされたメッセージを表示できないため、デバッグに使用します。 – eliang

+0

ここで最後に答えますが、他の人にはメッセージのエンコーディングがメッセージ空間の20%〜30%を占めることがあります。より大きなメッセージに余裕を持たせる必要がある場合は、エンコーディングが役立ちます。 –

7

実際には、MessageクラスはRawMessageから継承されています。そのため、すべてのメソッドがあります。 これらの方法の1つは次のとおりです。

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にメッセージを挿入します。あなたがRawMessageとしてそれをプルしない限り、botoを使ってPythonでそれを引き出すと、ゴミが生成されます。よかった! – Skrymsli

関連する問題