2012-05-22 8 views
8

De forma predeterminada, boto codifica los mensajes con Base64 antes de que los mensajes se envíen a SQS. Código de ejemplo:Lectura de mensajes sin procesar desde Amazon SQS usando boto

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

Mediante la sustitución de Mensaje() con RawMessage(), que puede enviar mensajes primas a la cola sin codificación. Pero, ¿cómo leo mensajes de la cola sin decodificar? Si uso el siguiente código:

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

m.get_body() devuelve automáticamente el resultado decodificado. ¿Hay alguna manera de recuperar los mensajes en bruto?

Gracias!

Respuesta

3

El constructor de boto.sqs.queue.Queue tiene un argumento message_class, que podría establecer a RawMessage. Por otro lado, no veo por qué podría tener sentido no codificar esos datos antes de transmitirlos.

+1

¡Gracias, funciona! Lo uso para la depuración porque no se puede ver el mensaje codificado en la consola AWS SQS. – eliang

+0

Última respuesta aquí, pero para otros, la codificación de los mensajes puede tomar un sólido 20% -30% de su espacio de mensajes. Si necesita ese margen adicional para mensajes más grandes, la codificación no puede ayudar. –

7

En realidad, la clase Message hereda de RawMessage, por lo que tiene todos sus métodos. Uno de estos métodos es:

get_body_encoded()

Este método es realmente un método semi-privada utilizada por el método Queue.write al escribir el contenido del mensaje a SQS. Probablemente no necesite llamar a este método en el curso normal de los eventos.

+0

Gracias! No sabía que hay tal método. – eliang

13

En caso de que le interese simplemente leer los mensajes de la cola de SQS y el productor era otra persona, puede comenzar a ver el carácter de basura cuando llame a get_messages(). Ver https://github.com/boto/boto/issues/831

solución en este caso de nuevo, es

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

Esto explica por qué me estoy volviendo loco cuando leo los mensajes enviados a SQS desde el SNS. – Zenexer

+0

Puse el mensaje en la Q con .NET AWSSDK usando una cadena para el cuerpo. Retirarlo en python con boto produce basura a menos que lo hagas como un mensaje en bruto. ¡Buena llamada! – Skrymsli

Cuestiones relacionadas