Python 3.x 从RabbitMQ获取消息而不使用

Python 3.x 从RabbitMQ获取消息而不使用,python-3.x,rabbitmq,Python 3.x,Rabbitmq,我希望获取Rabbitmq队列中存在的消息的副本,而不使用它们。可能吗? 提前感谢,您可以注册消费者(如官方文件所示),而无需向经纪人确认:no\u ack=True channel.basic_consume(callback, queue='hello', no_ack=True) 通过这种方式,您的消费者接收消息内容,但消息本身没有标记为由代理传递(当消费者退出时,返回到Ready状态) 也许这不是做你需要的事情的最干净的方法,但它很有效,而且很简单 您可以采用的另一种(但类似的)方法是

我希望获取Rabbitmq队列中存在的消息的副本,而不使用它们。可能吗?
提前感谢,

您可以注册消费者(如官方文件所示),而无需向经纪人确认:
no\u ack=True

channel.basic_consume(callback, queue='hello', no_ack=True)
通过这种方式,您的消费者接收消息内容,但消息本身没有标记为由代理传递(当消费者退出时,返回到
Ready
状态)

也许这不是做你需要的事情的最干净的方法,但它很有效,而且很简单

您可以采用的另一种(但类似的)方法是基于所谓的pull API(与您注册订户时使用的push API相反);我在.Net应用程序中使用了这种方法:您可以找到.Net文档,我认为Python API在这方面也很相似

关键思想是在不给出ack的情况下获取消息:
channel.BasicGet(queueName,noAck)

我希望这能帮助您朝着一个全面、可靠的解决方案迈进

我想获取Rabbitmq队列中存在的消息的副本 不消耗它们。可能吗

不可以。你最接近的选择是使用或获取一条消息,然后通过否定的确认拒绝它



注意:RabbitMQ团队监视
RabbitMQ用户
,有时只回答有关StackOverflow的问题。

我发现有一种更好的方法,可以使用
通道。basic_get()
函数获取队列上的所有消息,如下代码所示:

def\uuuu初始化(自):
self.host=ConfigTools().get_attr('host'))
self.waiting_queue=ConfigTools().get_attr('test_queue_name'))
def view_队列(自)->列表:
“”“读取队列中的所有内容,然后断开连接,导致服务器重新查询消息
此时返回传递标记是没有意义的,因为服务器会在
苍蝇和秩序可以不断地洗牌
连接=pika.BlockingConnection(
pika.ConnectionParameters(host=self.host))
msgs=[]
尽管如此:
chl=connection.channel()
方法框架,头框架,主体=chl.basic获取(queue='test')
如果方法_框架:
打印(“正文:”,正文)
msgs.append(正文)
其他:
打印(“不再返回消息”)
连接。关闭()
打破
返回MSG
然后,如果在任何时候我知道要弹出队列中的哪个消息,我可以使用类似的方法:

def删除(自身,项目)->列表:
“”“从队列中删除项目。遍历整个队列,类似于查看队列,并确认。”
列表中匹配的消息,并返回消息。
如果项与队列中的多条消息匹配,则只删除一条消息
"""
如果存在(项目、列表):
如果不是(项中i的i实例(i,字节):
打印(“项必须是仅字节对象的列表”)
如果不存在(项目,字节):
打印(“项目必须是单字节对象”)
提高打字错误
连接=pika.BlockingConnection(
pika.ConnectionParameters(host=self.host))
msgs=[]
尽管如此:
chl=connection.channel()
方法框架,头框架,主体=chl.basic获取(queue='test')
如果方法_框架:
打印('正文:',正文)
如果body==项目:
打印(“找到项目!”)
msgs.append(正文)
chl.基本确认(方法、框架、交付标签)
连接。关闭()
返回MSG
其他:
打印(“未找到邮件”)
连接。关闭()
打破
返回MSG
注意:我将此应用程序用于一个队列中的消息少于50条的小应用程序。我不能说这个函数在更大的应用程序中会起什么作用


可能的重复此方法存在问题,因为它将消息置于“未确认”状态,直到使用者死亡。“no_ack”参数现在是“auto_ack”,具有反向逻辑,并且在basic_consume()中默认设置为False