boto.sqs:读写SQS消息

时间:2015-05-22 10:57:06

标签: boto messages amazon-sqs

我想从一个que读取消息并将它们写入另一个que。但是,消息类是自定义格式,我不知道如何编写消息类并导入它。

即,结构如下:

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?或者,如果我可以在阅读消息时继承该类并将其用于写入,那将更加容易。我可以做这些吗?

谢谢。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

garnaat的代码对我来说是有问题的(我用Java SDK读取队列可能就是这个原因)所以我对它进行了轻微的修改:

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