2012-05-22 8 views
8

Standardmäßig codiert Boto Nachrichten mit Base64, bevor die Nachrichten an SQS gesendet werden. Beispielcode:Lesen roher Nachrichten von Amazon SQS mit Boto

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

Durch Ersetzen Message() mit RawMessage() kann ich roh Nachrichten an die Warteschlange ohne Codierung senden. Aber wie lese ich Nachrichten aus der Warteschlange ohne Decodierung? Wenn ich den folgenden Code verwende:

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

m.get_body() gibt das dekodierte Ergebnis automatisch zurück. Gibt es eine Möglichkeit, rohe Nachrichten abzurufen?

Danke!

Antwort

3

Der Konstruktor von boto.sqs.queue.Queue hat ein message_class Argument, das Sie auf RawMessage einstellen könnte. Auf der anderen Seite sehe ich nicht, warum es Sinn machen könnte, diese Daten vor der Übertragung nicht zu kodieren.

+1

Danke, es funktioniert! Ich verwende es zum Debuggen, weil Sie keine codierte Nachricht in der AWS SQS-Konsole anzeigen können. – eliang

+0

Späte Antwort hier - aber für andere - die Codierung der Nachrichten kann solide 20% -30% Ihres Nachrichtenspeichers belegen. Wenn Sie diesen zusätzlichen Spielraum für größere Nachrichten benötigen, kann das nicht helfen. –

7

Eigentlich Message Klasse erbt von RawMessage, so hat es alle Methoden. Eine dieser Methoden ist:

get_body_encoded()

Diese Methode wirklich ein halbprivate Verfahren nach der Methode Queue.write verwendet, wenn der Inhalt der Nachricht an SQS zu schreiben. Sie wahrscheinlich sollte diese Methode im normalen Verlauf der Ereignisse nicht aufrufen müssen.

+0

Dank! Wusste nicht, dass es so eine Methode gibt. – eliang

13

Falls Sie nur die Nachrichten aus der SQS-Warteschlange lesen möchten und der Producer eine andere Person ist, können Sie beim Aufruf von get_messages() ein unscharfes Zeichen sehen. https://github.com/boto/boto/issues/831

Lösung in diesem Fall Wir sehen uns wieder, ist zu

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

Das erklärt, warum ich Unsinn bekomme, wenn ich Nachrichten von SNS an SQS lese. – Zenexer

+0

Ich lege die Nachricht mit .NET AWSSDK in den Q mit einer Zeichenfolge für den Körper. Wenn man es in Python mit Boto abzieht, entsteht Müll, wenn man es nicht als RawMessage abzieht. Guter Anruf! – Skrymsli