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

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

sudo rabbitmqctl list_queues列出了队列。

有像 sudo rabbitmqctl list_queue_messages <queue_name>这样的命令吗?

214006 次浏览

您应该启用管理插件。

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

将为您提供队列中的第一条消息。

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

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

以下是我的交换条件:

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 |
+-------+----------+-------------+-----------+---------+------------------------+---------------------+--------+----------+----------------+-------------------------+---------------------+--------+---------+

把一些东西塞进我的队列:

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        |
+-------------+----------+---------------+---------------------------------------+---------------+------------------+------------+-------------+

我编写了 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

这有点晚了,但是 Rabbitmq 有一个内建的跟踪器,允许您查看日志中的传入消息。如果启用,您可以只用 tail -f /var/tmp/rabbitmq-tracing/.log(在 mac 上)来观看消息。

详细的描述是这里 http://www.mikeobrien.net/blog/tracing-rabbitmq-messages

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

/api/queues/vhost/name/get

从队列中获取消息。(这不是 HTTP GET,因为它会改变队列的状态。)你应该发布一个身体看起来像:

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

Count 控制要获取的最大消息数。如果队列不能立即提供消息,您可能会收到比这更少的消息。

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

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

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

如果您希望从一个队列中获得多条消息,比如10条消息,那么要使用的命令是:

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

这是它在 http://localhost:15672上可用的前端界面的样子:

enter image description here

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