2012-05-22 3 views
8

По умолчанию boto кодирует сообщения с Base64 перед отправкой сообщений в SQS. Пример кода:Чтение необработанных сообщений из SQS Amazon с использованием boto

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

Заменив сообщение() с RawMessage(), я могу послать необработанные сообщения в очереди без кодирования. Но как читать сообщения из очереди без декодирования? Если я использую следующий код:

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()

Этот метод действительно полуотдельной метод, используемый методом Queue.write при записи содержимого сообщения в SQS. Возможно, вам не нужно вызывать этот метод в обычном ходе событий .

+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

Это объясняет, почему я получаю ерунду, когда читаю сообщения, отправленные в SQS из SNS. – Zenexer

+0

Я положил сообщение в Q с помощью .NET AWSSDK, используя строку для тела. Вытащить его в python с помощью boto производит мусор, если вы не отталкиваете его как RawMessage. Хороший звонок! – Skrymsli

Смежные вопросы