有没有人知道是否有办法从客户端应用程序检查RabbitMQ队列中的消息数量?
我正在使用.NET客户端库。
答案 0 :(得分:66)
您实际上可以通过客户端检索此内容。执行queue_declare
操作时,RabbitMQ返回包含(<queue name>, <message count>, <consumer count>)
的三元组。 queue_declare的passive
参数允许您在不修改服务器状态的情况下检查队列是否存在。因此,您可以使用queue_declare
和passive
选项来检查队列长度。不确定.NET,但在Python中它看起来像这样:
name, jobs, consumers = chan.queue_declare(queue=queuename, passive=True)
答案 1 :(得分:10)
我已经晚了2年但是我自己也在搜索它,发现rabbitmq给你一个简单的脚本来与erlang节点进行通信..在sbin文件夹中,RabbitMQ的起始脚本位于...所以你基本上可以说
./rabbitmqctl list_queues
这将显示队列以及等待这些队列的消息计数 同样你也可以说
./rabbitmqctl list_channels
./rabbitmqctl list_connections
等。 有关详细信息,请访问here
答案 2 :(得分:9)
如果您想在.Net中执行此操作,请检查您正在使用的客户端库版本。
我正在使用 2.2.0 版本,我不得不使用BasicGet(queue,noAck)。
在此版本的Library QueueDeclare()中,只返回包含队列名称的字符串。
BasicGetResult result = channel.BasicGet("QueueName", false);
uint count = result != null ? result.MessageCount : 0;
我知道在 2.6.1 版本中,QueueDeclare()返回一个QueueDeclareOk类型的对象。
QueueDeclareOk result = channel.QueueDeclare();
uint count = result.MessageCount;
或者,您可以从命令行调用:
<InstallPathToRabbitMq>\sbin\rabbitmqctl.bat list_queues
您会看到以下输出:
列出队列......
队列名称1 ...已完成。
HTH
答案 3 :(得分:9)
我正在使用.Net客户端库的 3.3.1 版本。
我使用以下内容,这与Ralph Willgoss的第二个建议非常相似,但您可以提供队列名称作为参数。
QueueDeclareOk result = channel.QueueDeclarePassive(queueName);
uint count = result != null ? result.MessageCount : 0;
答案 4 :(得分:5)
更新:看来自mmalone非常有用的帖子后,queue_declare(..)的pika实现已经改变。
在python / pika(v0.9.5)中,仍然可以通过鼠标来检查队列深度,但它需要稍微更间接的方法。
queue_declare(...)将方法对象传递给其回调函数,然后您可以检查该函数。例如,要检查名为'myQueue'
的队列中的消息和使用者数:
def cbInspect(qb):
messagesInQueue = qb.method.message_count
print "There are %d messages in myQueue" % messagesInQueue
consumersInQueue = qb.method.consumer_count
print "There are %d consumers in myQueue" % consumersInQueue
return
myChannel = channel.queue_declare(callback=cbInspect, queue='myQueue', passive=True)
希望这会有所帮助,请在我身上轻松一点,我是新来的: - )
答案 5 :(得分:4)
您可以使用此处记录的IModel的MessageCount方法
编辑:我知道这是一篇非常古老的帖子,但它是第一个谷歌回复,我希望它能帮助人们在将来寻找这个答案。
答案 6 :(得分:2)
至少从RabbitMQ 3.3.5开始,您可以通过调用RabbitMQ Management HTTP API在没有任何RabbitMQ客户端库的C#程序中执行此操作:
// The last segment of the URL is the RabbitMQ "virtual host name".
// The default virtual host name is "/", represented urlEncoded by "%2F".
string queuesUrl = "http://MY_RABBITMQ_SERVER:15672/api/queues/%2F";
WebClient webClient = new WebClient { Credentials = new NetworkCredential("MY_RABBITMQ_USERNAME", "MY_RABBITMQ_PASSWORD") };
string response = webClient.DownloadString(queuesUrl);
用户名和密码与您用于登录RabbitMQ管理控制台UI的用户名和密码相同。
响应将是一个带有队列列表的JSON字符串,包括其消息计数以及其他属性。 (如果您愿意,可以使用像Json.NET这样的库将该JSON反序列化为C#对象。)
API文档与RabbitMQ管理控制台一起安装,应该可以在http://MY_RABBITMQ_SERVER:15672/api的该服务器上使用。
答案 7 :(得分:0)
我能够从python程序中获取队列的大小/深度。 1.使用py_rabbit
from pyrabbit.api import Client
cl = Client('10.111.123.54:15672', 'userid', 'password',5)
depth = cl.get_queue_depth('vhost', 'queue_name')
conn = kombu.Connection('amqp://userid:password@10.111.123.54:5672/vhost')
conn.connect()
client = conn.get_manager()
queues = client.get_queues('vhost')
for queue in queues:
if queue == queue_name:
print("tasks waiting in queue:"+str(queue.get("messages_ready")))
print("tasks currently running:"+str(queue.get("messages_unacknowledged")))
IP地址只是一个例子。