用命令行创建RabbitMQ队列和绑定

90

如果我在我的机器上安装了RabbitMQ,那么有没有一种方法可以在命令行中创建一个消息队列并将其绑定到特定的交换机而不使用客户端?

我认为这是不可能的,但我想要确认一下。

12个回答

150

概述:

其他回答是所要求的好的替代方案。以下是你可以在命令行中使用的命令。

首先,执行所有必要的准备工作,例如安装rabbit、rabbitmqadminrabbitctl。想法是使用来自rabbitmqctlrabbitmqadmin的命令。您可以查看一些命令示例:https://www.rabbitmq.com/management-cli.html

示例命令/设置:

以下命令应该会给你大部分(如果不是全部)所需内容:

# Get the cli and make it available to use.
wget http://127.0.0.1:15672/cli/rabbitmqadmin
chmod +x rabbitmqadmin
mv rabbitmqadmin /etc/rabbitmq

添加用户和权限

rabbitmqctl add_user testuser testpassword
rabbitmqctl set_user_tags testuser administrator
rabbitmqctl set_permissions -p / testuser ".*" ".*" ".*"

创建虚拟主机并设置权限

rabbitmqctl add_vhost Some_Virtual_Host
rabbitmqctl set_permissions -p Some_Virtual_Host guest ".*" ".*" ".*"

进行交换

./rabbitmqadmin declare exchange --vhost=Some_Virtual_Host name=some_exchange type=direct

排队

./rabbitmqadmin declare queue --vhost=Some_Virtual_Host name=some_outgoing_queue durable=true

建立绑定

./rabbitmqadmin --vhost="Some_Virtual_Host" declare binding source="some_exchange" destination_type="queue" destination="some_incoming_queue" routing_key="some_routing_key"

Python中另一种绑定方法

下面是与命令行绑定不同的另一种选择,因为我有时会遇到问题,并发现以下Python代码更加可靠。

#!/usr/bin/env python
import pika

rabbitmq_host = "127.0.0.1"
rabbitmq_port = 5672
rabbitmq_virtual_host = "Some_Virtual_Host"
rabbitmq_send_exchange = "some_exchange" 
rabbitmq_rcv_exchange = "some_exchange"
rabbitmq_rcv_queue = "some_incoming_queue"
rabbitmq_rcv_key = "some_routing_key"

outgoingRoutingKeys = ["outgoing_routing_key"]
outgoingQueues = ["some_outgoing_queue "]

# The binding area
credentials = pika.PlainCredentials(rabbitmq_user, rabbitmq_password)
connection = pika.BlockingConnection(pika.ConnectionParameters(rabbitmq_host, rabbitmq_port, rabbitmq_virtual_host, credentials))
channel = connection.channel()
channel.queue_bind(exchange=rabbitmq_rcv_exchange, queue=rabbitmq_rcv_queue, routing_key=rabbitmq_rcv_key)

for index in range(len(outgoingRoutingKeys)):
    channel.queue_bind(exchange=rabbitmq_send_exchange, queue=outgoingQueues[index], routing_key=outgoingRoutingKeys[index])

以上内容可以作为Python脚本的一部分运行。请注意,我将输出内容放入了数组中,这将允许您遍历它们。这应该使得部署变得容易。

最后的想法

我认为以上内容应该会帮助你朝着正确的方向前进,如果有任何特定命令不清楚,请使用谷歌或阅读更多相关文档,可以使用rabbitmqadmin help subcommands进行查询。我试图使用自解释的变量名称。


1
非常好的答案,谢谢。 - webofmars
1
太好了!感谢提供逐步指南。如果rabbitmqadmin出现访问被拒绝的错误,请考虑在命令末尾添加“-u testuser -p testpassword”。 - Winster

31

安装RabbitMQ管理插件。它带有一个命令行工具,您可以使用该工具配置所有队列/交换等。


4
你能详细说明一下吗?访问那个页面并没有显示出你所描述的内容。你是在说 load_definitions 变量和相应的文件吗?还是使用 curl 和 HTTP API 的描述?我希望有比手动构建 HTTP 请求更加用户友好的方法。 - Aaron Dufour
2
为了回答自己的问题,可以在命令行上使用 rabbitmqadminrabbitmqadmin help subcommands 似乎是最好的文档。 - Aaron Dufour

26
创建交易所:
rabbitmqadmin -u {user} -p {password} -V {vhost} declare exchange name={name} type={type}

创建队列:

rabbitmqadmin -u {user} -p {password} -V {vhost} declare queue name={name}

将队列绑定到交换机:

rabbitmqadmin -u {user} -p {password} -V {vhost} declare binding source={Exchange} destination={queue}

9
也许有点晚了,但我已经使用CURL完成了这个任务。
关于队列:
curl -i -u RABBITUSER:RABBITPASSWORD -H "content-type:application/json" \
-XPUT -d'{"durable":true}' \
http://192.168.99.100:15672/api/queues/%2f/QUEUENAME

关于绑定

curl -i -u RABBITUSER:RABBITPASSWORD -H "content-type:application/json" \
-XPOST -d"{\"routing_key\":\"QUEUENAME\"}" \
http://192.168.99.100:15672/api/bindings/%2f/e/EXCHANGENAME/q/QUEUENAME

注意:192.168.99.100:15672指向我的RMQ管理界面。


只有这个帮了我...我把它添加到我的DockerFile中...非常好用。谢谢。 :-) - We are Borg
这个对我返回了404错误,但这个可以用:curl -i -u RABBITUSER:RABBITPASSWORD -H "content-type:application/json" -XPUT -d'{"durable":true}' http://localhost:15672/rabbitmq/api/queues/%2f/QUEUENAME - Vladimir
这是一般的API参考文档(在我看来,非常难找到)- https://raw.githack.com/rabbitmq/rabbitmq-management/rabbitmq_v3_6_9/priv/www/api/index.html - undefined

8
如果您正在使用Linux Debian,那么有一个名为amqp-tools的软件包。请使用以下命令进行安装:
apt-get install amqp-tools

接着,您可以使用诸如amqp-publish等命令行来将消息发送到您的队列中。

amqp-publish -e exchange_name -b "your message"

然后,您可以使用以下方式从队列中收集消息:

amqp-get -q queue_name

或者

amqp-consume -q queue_name

还有rabbitmq-c包/库中的(命令行)示例。在构建后,您可以通过命令行发送消息,例如:

amqp_sendstring localhost 5672 amq.direct test "hello world"

玩得开心...


你会如何使用这个来创建一个队列和交换机? - undefined

4

rabbitmqctl是提供的命令行界面,无法创建队列并绑定。

然而,使用一个快速脚本完全可以做到这一点,RabbitMQ入门指南还展示了多个例子,涵盖了生产者和消费者两个方面。

#do some work to connect
#do some work to open a channel
channel.queue_declare(queue='helloworld')

我简要介绍一下连接的过程,但是创建队列只需要一行代码。这个操作也是幂等的,这意味着你可以在脚本中包含该语句,并且不用担心它会不断地重新创建队列或者破坏已经存在的同名队列。


3

在Windows命令行界面上动态创建RabbitMQ Exchange、Queue和Bindings

我已经安装并运行了多个队列和交换机的RabbitMQ服务器,现在想要通过命令行实时创建它们。我知道这是一个老问题,但我认为提供这些信息会有所帮助。

以下是我的操作步骤:

设置

  1. 下载并安装Python 2.6.6-201008-24 Windows x86-64 MSI installer或任何版本的Python。
  2. 下载RabbitMqAdmin:RabbitMq Web用户界面有一个“Command Line”链接,可导航到http://server-name:15672/cli/(其中server-name是安装RabbitMQ的服务器)。或者,使用上述网址并将文件保存为Python exe的位置下的rabbitmqadmin.exe

例如:C:\Python26
C:\Python26\python C:\Python26\rabbitmqadmin.exe

代码:在批处理文件中使用以下命令

  1. 创建Exchange:
c:\python26\python.exe rabbitmqadmin.exe declare exchange name=*ExchangeName1* type=topic durable=true
  1. 创建队列:
c:\python26\python.exe rabbitmqadmin.exe declare queue name=*NameofQueue1* durable=true
  1. 创建绑定:
c:\python26\python.exe rabbitmqadmin.exe declare binding source=ExchangeName1 destination_type=queue destination=*NameofQueue1* routing_key=*RoutingKey1*

通过执行rabbitmqadmin.exe -help -subcommands命令,可以列出所有可用的命令。
例如:c:\python26\python.exe rabbitmqadmin.exe -help -subcommands。

0
如果有任何Windows用户正在寻找基于PowerShell的解决方案,那么这是我编写的函数。
Function createQueue([string]$QueueName){
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("content-type", "application/json")
$headers.Add("Authorization", "Basic Z3Vlc3Q6Z3Vlc3Q=")

$body = "{
`n  `"vhost`": `"/`",
`n  `"name`": `"$QueueName`",
`n  `"durable`": `"true`",
`n  `"arguments`": {}
`n}"

# Write-Host $body

$url='http://localhost:15672/api/queues/%2f/'+$QueueName

# Write-Host  $url

$response = Invoke-RestMethod $url -Method 'PUT' -Headers $headers -Body $body
$response | ConvertTo-Json
}

将此内容保存到 helper.ps1 文件中,并像这样将其包含在您的脚本中。
$queueNames = 'my-queue-name'

. .\helper.ps1

createQueue($queueName)

0

这里有一个更简洁的 Python 示例,取自 RabbitMQ Python 教程

首先,安装 pika:

sudo easy_install pika
# (or use pip)

这是发送消息到本地主机所需的全部内容:

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

channel.queue_declare(queue='test-queue')
channel.basic_publish(exchange='', routing_key='test-queue', body='Hello World!')

0

对我个人而言,我的RabbitMQ管理交易一直试图重定向到https版本...我的所有设置都是基础的,我甚至没有配置文件... 无论如何,我的解决方法是在sbin文件夹中手动创建rabbitmqadmin.py,然后用https://raw.githubusercontent.com/rabbitmq/rabbitmq-management/v3.8.1/bin/rabbitmqadmin填充它。

然后,确保python在您的PATH中,并运行此命令,例如,添加一个交换:

python rabbitmqadmin.py declare exchange --vhost=/ name=CompletedMessageExchange type=direct

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接