如何使用Python列出或发现RabbitMQ交换器上的队列?

47 投票
9 回答
84759 浏览
提问于 2025-04-16 07:39

我需要一个Python客户端,它可以在重启后的RabbitMQ服务器上找到队列,然后启动客户端继续从每个队列中消费消息。我该如何通过某个与RabbitMQ兼容的Python API或库来发现这些队列呢?

9 个回答

31

你可以添加插件 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()]
51

看起来没有直接通过AMQP来管理服务器的方法,但你可以通过Python来实现。我建议你使用一个叫做subprocess的模块,结合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,根据你的需要来使用它。

29

据我所知,目前没有任何方法可以做到这一点。这跟Python没有关系,而是因为AMQP并没有定义任何发现队列的方法。

在AMQP中,实际上是客户端(消费者)来声明队列的:发布者把消息发布到一个交换器,并使用一个路由键,而消费者则决定这些路由键应该发送到哪些队列。所以在没有消费者的情况下,谈论队列是没有意义的。

撰写回答