【问题标题】:Unable to retrieve Messages from AWS SQS queue using Boto无法使用 Boto 从 AWS SQS 队列中检索消息
【发布时间】:2018-06-04 16:03:51
【问题描述】:

我的python代码如下:

import json
import boto.sqs
import boto
from boto.sqs.connection import SQSConnection
from boto.sqs.message import Message
from boto.sqs.message import RawMessage


sqs = boto.connect_sqs(aws_access_key_id='XXXXXXXXXXXXXXX',aws_secret_access_key='XXXXXXXXXXXXXXXXX')
q = sqs.create_queue("Nishantqueue")  // Already present


q.set_message_class(RawMessage)
results = q.get_messages()
ret = "Got %s result(s) this time.\n\n" % len(results)

for result in results:
        msg = json.loads(result.get_body())
        ret += "Message: %s\n" % msg['message']

ret += "\n... done."
print ret

我的 SQS 队列包含至少 5 到 6 条消息...当我执行此操作时...我得到输出,并且每次运行时都会出现此输出,此代码无法从队列中提取 mssgs:

Got 0 result(s) this time.

...done.

我确定我在循环中遗漏了一些东西....虽然找不到

【问题讨论】:

  • 你怎么知道队列包含5-6条消息?您是否通过其他工具确认了这一点?
  • AWS GUI,我手动以及通过 boto 插入它们
  • 您确定您在上述代码中使用的区域与 AWS 控制台中的区域相同吗?因为您实际上是在调用create_queue,所以此代码只会在您运行它的任何区域中创建一个新的空队列。
  • 是的,并且 create_queue 方法在我指定 visibility_timeout 属性之前不会创建新队列
  • 这是不正确的。 visibility_timeout 参数到 create_queue 是可选的。如果您仅使用队列名称调用它,如果队列不存在,它将创建队列。

标签: amazon-web-services boto amazon-sqs


【解决方案1】:

您的代码正在从 Amazon SQS 队列中检索消息,但似乎并未删除它们。这意味着消息将在一段时间内不可见(由visibility_timeout 参数指定),之后它们将重新出现。预期如果在这段时间内没有删除一条消息,那么它就没有被处理,应该重新出现在队列中以重试。

这里有一些代码从队列中提取消息,然后在处理后将其删除。请注意在检索消息时指定的visibility_timeout。它使用read() 简单地返回一条消息:

#!/usr/bin/python27

import boto, boto.sqs
from boto.sqs.message import Message

# Connect to Queue
q_conn = boto.sqs.connect_to_region("ap-southeast-2")
q = q_conn.get_queue('queue-name')

# Get a message
m = q.read(visibility_timeout=15)
if m == None:
  print "No message!"
else:
  print m.get_body()
  q.delete_message(m)

当您尝试检索它们时,您的消息可能是不可见的(“正在进行中”)。

【讨论】:

  • 感谢您的帮助.. 这可行.. 虽然我不想删除我的消息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
相关资源
最近更新 更多