RabbitMQ - 使用 curl 从队列中获取消息

Oz1*_*123 7 linux curl rabbitmq

我正在尝试使用 rabbitmq 的 HTTP API 从队列中获取一些消息。

我正在关注这里的文档, 我没有vhost配置。

我尝试了以下 curl 命令:

curl -i -u guest:guest -H "content-type:application/json" -X POST http://127.0.0.1:15672/api/queues/foo/get -d'{"count":5,"requeue":true,"encoding":"auto","truncate":50000}'
Run Code Online (Sandbox Code Playgroud)

RabbitMQ 然后回答:

HTTP/1.1 405 Method Not Allowed
vary: origin
Server: MochiWeb/1.1 WebMachine/1.10.0 (never breaks eye contact)
Date: Thu, 20 Apr 2017 08:03:28 GMT
Content-Length: 66
Allow: HEAD, GET, PUT, DELETE, OPTIONS

{"error":"Method Not Allowed","reason":"\"Method Not Allowed\"\n"}
Run Code Online (Sandbox Code Playgroud)

你能指出我的错误吗?我怎样才能收到这些消息?

Gab*_*ele 7

您缺少队列名称:

curl -i -u guest:guest -H "content-type:application/json" -X POST http://127.0.0.1:15672/api/queues/foo/my_queue/get -d'{"count":5,"requeue":true,"encoding":"auto","truncate":50000}'
Run Code Online (Sandbox Code Playgroud)

其中foo是虚拟主机,my_queue是队列名称。

结果:

[
   {
      "payload_bytes":4,
      "redelivered":true,
      "exchange":"",
      "routing_key":"my_queue",
      "message_count":5,
      "properties":{
         "delivery_mode":1,
         "headers":{

         }
      },
      "payload":"test",
      "payload_encoding":"string"
   },
   {
      "payload_bytes":4,
      "redelivered":true,
      "exchange":"",
      "routing_key":"my_queue",
      "message_count":4,
      "properties":{
         "delivery_mode":1,
         "headers":{

         }
      },
      "payload":"test",
      "payload_encoding":"string"
   },
   {
      "payload_bytes":4,
      "redelivered":true,
      "exchange":"",
      "routing_key":"my_queue",
      "message_count":3,
      "properties":{
         "delivery_mode":1,
         "headers":{

         }
      },
      "payload":"test",
      "payload_encoding":"string"
   },
   {
      "payload_bytes":4,
      "redelivered":true,
      "exchange":"",
      "routing_key":"my_queue",
      "message_count":2,
      "properties":{
         "delivery_mode":1,
         "headers":{

         }
      },
      "payload":"test",
      "payload_encoding":"string"
   },
   {
      "payload_bytes":4,
      "redelivered":true,
      "exchange":"",
      "routing_key":"my_queue",
      "message_count":1,
      "properties":{
         "delivery_mode":1,
         "headers":{

         }
      },
      "payload":"test",
      "payload_encoding":"string"
   }
]
Run Code Online (Sandbox Code Playgroud)

编辑

如果您使用的是默认虚拟主机:

curl -i -u guest:guest -H "content-type:application/json" -X POST http://127.0.0.1:15672/api/queues/%2f/my_queue/get -d'{"count":5,"requeue":true,"encoding":"auto","truncate":50000}'
Run Code Online (Sandbox Code Playgroud)


Oz1*_*123 6

我设法解决了这个问题。钥匙:

我没有配置虚拟主机。

RabbitMQ 使用“/”符号表示默认 VHOST。

在此输入图像描述

“/”在 HTTP 中被翻译成%2F...

所以正确的调用是:

curl -u guest:guest -i -H "content-type:application/json" -X POST http://127.0.0.1:15672/api/queues/%2F/foo/get -d'{"count":5,"requeue":true,"encoding":"auto","truncate":50000}' 
Run Code Online (Sandbox Code Playgroud)


Áko*_*kos 6

请注意,在最近的版本中语法似乎发生了变化(并且 HTTP API 文档似乎滞后了)并且需要设置选项而不是requeue选项ack_mode,例如"ack_mode"="ack_requeue_true"

因此,当前 RabbitMQ 版本的上述示例将是:

curl -u guest:guest -i -H "content-type:application/json" -X POST http://127.0.0.1:15672/api/queues/%2F/foo/get -d'{"count":5,"ack_mode"="ack_requeue_true","encoding":"auto","truncate":50000}' 
Run Code Online (Sandbox Code Playgroud)

  • 它需要是 {"ackmode":"ack_requeue_true"} 而不是 {"ack_mode"="ack_requeue_true"},否则你会得到 not json 错误。 (6认同)