42

我需要有一个 python 客户端,它可以在重新启动的 RabbitMQ 服务器交换上发现队列,然后启动一个客户端以恢复消费来自每个队列的消息。如何从一些 RabbitMQ 兼容的 python api/库中发现队列?

4

8 回答 8

49

似乎没有直接的 AMQP 方式来管理服务器,但有一种方法可以从 Python 中完成。我建议使用结合命令的子进程rabbitmqctl模块来检查队列的状态。

我假设您在 Linux 上运行它。从命令行,运行:

rabbitmqctl list_queues

将导致:

Listing queues ...
pings   0
receptions      0
shoveled        0
test1   55199
...done.

(好吧,由于我的特定队列,在我的情况下确实如此)

在您的代码中,使用此代码获取以下输出rabbitmqctl

import subprocess

proc = subprocess.Popen("/usr/sbin/rabbitmqctl list_queues", shell=True, stdout=subprocess.PIPE)
stdout_value = proc.communicate()[0]
print stdout_value

然后,只需想出自己的代码来解析stdout_value供自己使用。

于 2011-11-17T06:44:27.673 回答
27

据我所知,没有任何方法可以做到这一点。这与 Python 无关,但因为 AMQP 没有定义任何队列发现方法。

在任何情况下,在 AMQP 中,声明队列的是客户端(消费者):发布者使用路由键将消息发布到交换,消费者确定这些路由键进入哪些队列。所以在没有消费者的情况下谈论队列是没有意义的。

于 2010-11-26T20:14:38.163 回答
22

您可以添加插件 rabbitmq_management

sudo /usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management
sudo service rabbitmq-server restart

然后使用rest-api

import requests

def rest_queue_list(user='guest', password='guest', host='localhost', port=15672, virtual_host=None):
    url = 'http://%s:%s/api/queues/%s' % (host, port, virtual_host or '')
    response = requests.get(url, auth=(user, password))
    queues = [q['name'] for q in response.json()]
    return queues

我在这个例子中使用了requests库,但这并不重要。

我还找到了为我们做这件事的图书馆——pyrabbit

from pyrabbit.api import Client
cl = Client('localhost:15672', 'guest', 'guest')
queues = [q['name'] for q in cl.get_queues()]
于 2014-01-22T14:59:58.437 回答
3

因为我是一个 RabbitMQ 初学者,所以对它持保留态度,但是有一个有趣的管理插件,它公开了一个 HTTP 接口“从这里你可以管理交换、队列、绑定、虚拟主机、用户和权限。希望 UI是相当不言自明的。”

http://www.rabbitmq.com/blog/2010/09/07/management-plugin-preview-release/

于 2010-12-06T15:32:34.437 回答
3

我使用https://github.com/bkjones/pyrabbit。它直接与 RabbitMQ 的 mgmt 插件的 API 接口对话,对于询问 RabbitMQ 非常方便。

于 2012-11-09T15:32:21.310 回答
2

管理功能将在 AMQP 的未来版本中提供。因此,现在您将不得不等到具有该功能的新版本。

于 2010-11-26T23:23:32.230 回答
2

我发现这对我有用,/els 是我的演示虚拟主机名称..

rabbitmqctl list_queues --vhost /els
于 2020-11-26T20:10:34.740 回答
0

pyrabbit 对我来说不太好用;但是,管理插件本身有自己的命令行脚本,您可以从自己的管理 GUI 下载并稍后使用(例如,我从

http://localhost:15672/cli/

供本地使用)

于 2013-05-30T04:34:28.523 回答