2015-05-22 7 views
0

Я хотел бы читать сообщения из одной очереди и записывать их в другую очередь. Но класс сообщения - это настраиваемый формат, и я не уверен, как написать класс сообщения и импортировать его.boto.sqs: читать и писать сообщения SQS

То есть, структура следующим образом:

import boto.sqs 

#read messages from one que 
conn = boto.sqs.connect_to_region("regionName") 
q=conn.get_queue('queueName') 
res=q.get_messages() 
m = res[0].get_body() #This is the message I read 

#Now, I want to write the message into another que 
r = conn.get_queue('DifferentqueueName') 
r.write(m) 

Здесь код брейки и я получаю следующее сообщение об ошибке:

224   new_msg = self.connection.send_message(self, 
--> 225    message.get_body_encoded(), delay_seconds=delay_seconds, 
226    message_attributes=message.message_attributes) 
227   message.id = new_msg.id 

AttributeError: 'unicode' object has no attribute 'get_body_encoded' 

Как можно определить пользовательский класс сообщения и использовать его пишите в другой que? Или, если бы я мог просто наследовать класс при чтении сообщений и использовать его для записи, это было бы еще проще. Могу ли я сделать что-нибудь из этого?

спасибо.

ответ

1

Причина, по которой вы получаете сообщение об ошибке, заключается в том, что вы пытаетесь записать необработанную строку в очередь, а не объект Message. Попробуйте это вместо: код

import boto.sqs 

#read messages from one que 
conn = boto.sqs.connect_to_region("regionName") 
q1 = conn.get_queue('queueName') 
q2 = conn.get_queue('DifferentqueueName') 
messages = q1.get_messages() 
for message in messages: 
    msg_body = message.get_body() #This is the message I read 
    # Now, I want to write the message into another queue  
    new_msg = q2.new_message(msg_body) 
    q2.write(new_msg) 
+0

Благодаря! именно то, что мне нужно! – user4279562

1

garnaat было сопряжено с проблемами для меня (я читаю очередь с Java SDK, может быть, причина), поэтому я использовал небольшой veriation на нем:

import boto.sqs 
from boto.sqs.message import RawMessage 

conn = boto.sqs.connect_to_region("avilability_zone") 
q1 = conn.get_queue('original_queue') 
q2 = conn.get_queue('new_queue') 

for i in range(1,400): 
    messages = q1.get_messages(10) 
    for message in messages: 
     msg_body = message.get_body() 
     new_msg = RawMessage() 
     new_msg.set_body(msg_body) 
     q2.write(new_msg) 
     q1.delete_message(message) 
    print("{}/400".format(i)) 
Смежные вопросы