是否可以直接从命令行查看 RabbitMQ 消息内容?

Posted

技术标签:

【中文标题】是否可以直接从命令行查看 RabbitMQ 消息内容?【英文标题】:Is it possible to view RabbitMQ message contents directly from the command line? 【发布时间】:2012-05-29 09:17:06 【问题描述】:

是否可以直接从命令行查看RabbitMQ消息内容?

sudo rabbitmqctl list_queues 列出队列。

有没有类似sudo rabbitmqctl list_queue_messages <queue_name>的命令?

【问题讨论】:

关于在linux上安装rabbitmqadmin***.com/questions/36336071/… 【参考方案1】:

您应该启用管理插件。

rabbitmq-plugins enable rabbitmq_management

看这里:

http://www.rabbitmq.com/plugins.html

这里是管理的细节。

http://www.rabbitmq.com/management.html

最后设置完成后,您需要按照以下说明安装和使用 rabbitmqadmin 工具。可用于与系统进行充分交互。 http://www.rabbitmq.com/management-cli.html

例如:

rabbitmqadmin get queue=<QueueName> requeue=false

会给你队列中的第一条消息。

【讨论】:

谢谢,为我工作!这可能会有所贡献:默认情况下,rabbitmqadmin 不能从任何地方调用。它位于 /var/lib/rabbitmq/mnesia/rabbit@NODENAME-plugins-expand/rabbitmq_management-3.1.3/priv/www/cli。需要修复它的权限(chmod 755 rabbitmqadmin)并可能将其复制到 /usr/local/bin ,请参阅rabbitmq.com/management-cli.html 如果您只想查看消息,而不是将其从队列中取出,您应该删除requeue=false 位并执行rabbitmqadmin get queue=&lt;QueueName&gt; 您应该知道,重新排队的消息设置了重新传递标志,因此后续消费者将不会收到相同的消息 我可以在网页界面看到消息内容吗? 使用ackmode=ack_requeue_false 丢弃消息或使用ackmode=ack_requeue_true 将它们保留在队列中而不是requeue=false【参考方案2】:

以下是我用来获取队列内容的命令:

RabbitMQ 3.1.5 版在 Fedora linux 上使用 https://www.rabbitmq.com/management-cli.html

这是我的交流:

eric@dev ~ $ sudo python rabbitmqadmin list exchanges
+-------+--------------------+---------+-------------+---------+----------+
| vhost |        name        |  type   | auto_delete | durable | internal |
+-------+--------------------+---------+-------------+---------+----------+
| /     |                    | direct  | False       | True    | False    |
| /     | kowalski           | topic   | False       | True    | False    |
+-------+--------------------+---------+-------------+---------+----------+

这是我的队列:

eric@dev ~ $ sudo python rabbitmqadmin list queues
+-------+----------+-------------+-----------+---------+------------------------+---------------------+--------+----------+----------------+-------------------------+---------------------+--------+---------+
| vhost |   name   | auto_delete | consumers | durable | exclusive_consumer_tag |     idle_since      | memory | messages | messages_ready | messages_unacknowledged |        node         | policy | status  |
+-------+----------+-------------+-----------+---------+------------------------+---------------------+--------+----------+----------------+-------------------------+---------------------+--------+---------+
| /     | myqueue  | False       | 0         | True    |                        | 2014-09-10 13:32:18 | 13760  | 0        | 0              | 0                       |rabbit@ip-11-1-52-125|        | running |
+-------+----------+-------------+-----------+---------+------------------------+---------------------+--------+----------+----------------+-------------------------+---------------------+--------+---------+

将一些项目塞进 myqueue:

curl -i -u guest:guest http://localhost:15672/api/exchanges/%2f/kowalski/publish -d '"properties":,"routing_key":"abcxyz","payload":"foobar","payload_encoding":"string"'
HTTP/1.1 200 OK
Server: MochiWeb/1.1 WebMachine/1.10.0 (never breaks eye contact)
Date: Wed, 10 Sep 2014 17:46:59 GMT
content-type: application/json
Content-Length: 15
Cache-Control: no-cache

"routed":true

RabbitMQ 查看队列中的消息:

eric@dev ~ $ sudo python rabbitmqadmin get queue=myqueue requeue=true count=10
+-------------+----------+---------------+---------------------------------------+---------------+------------------+------------+-------------+
| routing_key | exchange | message_count |                        payload        | payload_bytes | payload_encoding | properties | redelivered |
+-------------+----------+---------------+---------------------------------------+---------------+------------------+------------+-------------+
| abcxyz      | kowalski | 10            | foobar                                | 6             | string           |            | True        |
| abcxyz      | kowalski | 9             | 'testdata':'test'                   | 19            | string           |            | True        |
| abcxyz      | kowalski | 8             | 'mykey':'myvalue'                   | 19            | string           |            | True        |
| abcxyz      | kowalski | 7             | 'mykey':'myvalue'                   | 19            | string           |            | True        |
+-------------+----------+---------------+---------------------------------------+---------------+------------------+------------+-------------+

【讨论】:

是命令sudo python rabbitmqadmin get queue=myqueue requeue=true count=10 来查看消息或将消息从末尾出列然后将它们重新排队到前面。有没有办法只查看消息而不是将它们出队。 我想 get 和 requeue=true 基本上告诉我们消息已出列并显示和重新入队(pushed_back to front)。 rabbitmqadmin 连接到基于 Web 的 API,这里需要 sudo 吗? 为什么requeue=True【参考方案3】:

我写了rabbitmq-dump-queue,它允许将消息从 RabbitMQ 队列转储到本地文件并按原始顺序重新排列消息。

使用示例(转储队列incoming_1的前50条消息):

rabbitmq-dump-queue -url="amqp://user:password@rabbitmq.example.com:5672/" -queue=incoming_1 -max-messages=50 -output-dir=/tmp

【讨论】:

【参考方案4】:

这有点晚了,但是是的,rabbitmq 有一个内置的跟踪器,可以让你在日志中看到传入的消息。启用后,您只需tail -f /var/tmp/rabbitmq-tracing/.log(在 Mac 上)即可观看消息。

详细说明在这里http://www.mikeobrien.net/blog/tracing-rabbitmq-messages

【讨论】:

链接已损坏。镜子:web.archive.org/web/20160319074032/http://www.mikeobrien.net/…。不错的自定义错误页面 BTW :)【参考方案5】:

您可以使用 RabbitMQ API 来获取计数或消息:

/api/queues/vhost/name/get

从队列中获取消息。 (这不是 HTTP GET,因为它会改变队列的状态。)您应该发布一个如下所示的正文:

"count":5,"requeue":true,"encoding":"auto","truncate":50000

count 控制要获取的消息的最大数量。如果队列不能立即提供消息,您收到的消息可能会少于此数量。

requeue 确定是否将消息从队列中删除。如果 requeue 为真,它们将被重新排队 - 但它们的重新传递标志将被设置。 encoding 必须是“auto”(在这种情况下,如果有效 UTF-8 有效负载将作为字符串返回,否则将返回 base64 编码)或“base64”(在这种情况下,有效负载将始终采用 base64 编码)。 如果存在 truncate ,如果它大于给定的大小(以字节为单位),它将截断消息有效负载。 截断是可选的;所有其他键都是必需的。

请注意,HTTP API 中的发布/获取路径旨在用于注入测试消息、诊断等 - 它们不实现可靠的传递,因此应被视为系统管理员的工具,而不是用于消息传递的通用 API。

http://hg.rabbitmq.com/rabbitmq-management/raw-file/rabbitmq_v3_1_3/priv/www/api/index.html

【讨论】:

只是一个简短的说明。 requeue 键现在是 ackmode,如此处所述 -> cdn.rawgit.com/rabbitmq/rabbitmq-management/v3.7.9/priv/www/api/…【参考方案6】:

如果你想要一个队列中的多条消息,比如 10 条消息,使用的命令是:

rabbitmqadmin get queue=<QueueName> ackmode=ack_requeue_true count=10

如果您不希望消息重新排队,只需将 ackmode 更改为 ack_requeue_false

【讨论】:

ackmode=ack_requeue_true 加一个,没有其他答案中提到的requeue 选项

以上是关于是否可以直接从命令行查看 RabbitMQ 消息内容?的主要内容,如果未能解决你的问题,请参考以下文章

rabbitmq命令和通过网页查看rabbit的消息队列

RabbitMQ常用命令行

RabbitMQ教程_6 搭建集群

RabbitMQ 环境安装

Centos Docker安装Rabbitmq及常见问题

Centos Docker安装Rabbitmq及常见问题