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

Posted

技术标签:

【中文标题】RabbitMQ 从命令行创建队列和绑定【英文标题】:RabbitMQ creating queues and bindings from command line 【发布时间】:2011-05-31 13:07:54 【问题描述】:

如果我的机器上安装了 RabbitMQ,有没有办法从命令行创建消息队列并将其绑定到某个交换而不使用客户端?

我认为这是不可能的,但我想确定。

【问题讨论】:

【参考方案1】:

总结:

其他答案是所要求的很好的替代方案。以下是您可以从命令行使用的命令。

首先,做所有必要的准备工作,例如安装兔子,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 运行。请注意,我将传出的内容放入数组中,这样您就可以遍历它们。这应该使部署变得容易。

最后的想法

我认为以上内容应该让您朝着正确的方向前进,如果任何特定命令没有意义,请使用 google 或通过rabbitmqadmin help subcommands 阅读更多内容。我尝试使用能够自我解释的变量。祝你好运:)

【讨论】:

很好的答案thanxs 太棒了!感谢您的分步指南。如果 rabbitmqadmin 抛出拒绝访问错误,请考虑在命令末尾添加“-u testuser -p testpassword”。【参考方案2】:

安装RabbitMQ management plugin。它带有一个命令行工具,您可以使用它来配置所有队列/交换/等。

【讨论】:

你能扩展一下吗?访问该页面不会显示您所描述的任何内容。您是在谈论load_definitions 变量和相应的文件吗?或者使用curl 的HTTP API 的描述?我希望有一些比手动构建 http reqs 更用户友好的东西。 要回答我自己的问题,请在命令行上使用rabbitmqadminrabbitmqadmin help subcommands 似乎是最好的文档。【参考方案3】:

创建交换:

rabbitmqadmin -u user -p password -V vhost declare exchange name=name type=type

创建队列:

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

将队列绑定到 Exchange:

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

【讨论】:

【参考方案4】:

聚会可能有点晚了,但我已经使用 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 中添加了这个......就像一个魅力。谢谢你。 :-) 这为我返回了 404 但这有效:curl -i -u RABBITUSER:RABBITPASSWORD -H "content-type:application/json" -XPUT -d'"durable":true' http://localhost:15672/rabbitmq/api/queues/%2f/QUEUENAME【参考方案5】:

如果您使用的是 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"

玩得开心……

【讨论】:

【参考方案6】:

rabbitmqctl,提供的命令行接口,没有公开创建队列和绑定它的能力。

然而,使用快速脚本来完成它是非常简单的,并且 RabbitMQ 入门指南显示了它的几个示例,无论是在发布者还是消费者方面。

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

我在掩饰连接,但它是创建队列的字面意思。该操作也是幂等的,这意味着您可以将语句包含在脚本中并且是安全的,因为您知道它不会继续重新创建队列或破坏现有的同名队列。

【讨论】:

【参考方案7】:

在 Windows 上通过 CLI 动态创建 RabbitMq Exchange、队列和绑定

我已经安装了一个 RabbitMQ 服务器并运行多个队列和交换,现在想从命令行动态创建它。我知道这是一个老问题,但我认为提供此信息会有所帮助。

以下是我所做的:

设置

    已下载并安装 Python 2.6.6-201008-24 Windows x86-64 MSI 安装程序,任何大于 2.X 但不是 3.X 的 python 版本 下载 RabbitMqAdmin:RabbitMq Web 用户界面有一个链接命令行,导航到 http://server-name:15672/cli/(服务器名称:安装 rabbitmq 的服务器)或者,使用上面的 url 并保存文件作为 rabbitmqadmin.exe 在 python exe 位置

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

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

    创建交换:

    c:\python26\python.exe rabbitmqadmin.exe 声明交换名称=ExchangeName1 type=topic persistent=true

    创建队列:

    c:\python26\python.exe rabbitmqadmin.exe 声明队列名称=NameofQueue1耐用=true

    创建绑定:

    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

【讨论】:

【参考方案8】:

对我来说,我的 RabbitMQ 管理交易一直试图重定向到 https 版本...我的设置中的所有内容都是普通的,我什至没有配置文件...无论如何,我的工作是手动创建 @ 987654322@ 在sbin 文件夹中,然后用https://raw.githubusercontent.com/rabbitmq/rabbitmq-management/v3.8.1/bin/rabbitmqadmin 填充它

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

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

【讨论】:

【参考方案9】:

这是一个更简单的 Python 示例,取自 RabbitMQ Python tutorial。

首先,安装 pika:

sudo easy_install pika
# (or use pip)

这就是向 localhost 发送消息所需的全部内容:

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!')

【讨论】:

【参考方案10】:

在 RabbitMQ 中创建和删除队列的演练:

我找不到执行此操作的命令行命令。这是我用 java 编写代码的方法。

Ubuntu 上的 Rabbitmq-server 版本 3.3.5

列出队列,还没有队列:

sudo rabbitmqctl list_queues
[sudo] password for eric:
Listing queues ...
...done.

把它放在 CreateQueue.java 中

import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
import java.util.*;
public class CreateQueue 
  public static void main(String[] argv) throws Exception 
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();
    Map<String, Object> args = new HashMap<String, Object>();
    args.put("x-message-ttl", 60000);
    channel.queueDeclare("kowalski", false, false, false, args);
    channel.close();
    connection.close();
  

提供你的 rabbitmq 安装附带的 jar 文件:

我使用的是 rabbitmq-client.jar 版本 0.9.1,使用你的 rabbitmq 版本附带的那个。

编译运行:

javac -cp .:rabbitmq-client.jar CreateQueue.java
java -cp .:rabbitmq-client.jar CreateQueue

它应该没有错误地完成,现在检查你的队列:

sudo rabbitmqctl list_queues
Listing queues ...
kowalski        0
...done.

kowalski 队列存在。

【讨论】:

【参考方案11】:

有助于在您进行交易时绑定交易所:

channel.queue_bind(queueName, exchange)

C-;

【讨论】:

以上是关于RabbitMQ 从命令行创建队列和绑定的主要内容,如果未能解决你的问题,请参考以下文章

rabbitmq常用命令行汇总

RabbitMQ常用命令行

RabbitMQ学习 (管理插件)

RabbitMQ教程_6 搭建集群

RabbitMQ系列队列绑定交换器

MQ常用命令