rabbitmq——通过rabbitmqctl创建exchange和queue

一般来说,exchange和queue都是由我们的业务程序在运行过程中连接到rabbitmq并创建的。然而也有些特殊的场景,要求业务程序在连接使用rabbitmq之前,相关的exchange和queue必须预先创建好。这个时候对于测试人员或者运维人员来说,通常的做法是在rabbitmq安装完成后,启用rabbitmq_management插件,然后在web控制台进行操作来创建exchange和queue,并完成绑定动作。

对于当前都是讲究自动化运维的时代,这种方式显然是不能自动化的。那么一些可能的改进的方式是搞个rabbitmq的客户端写个小程序,比如python的pika,通过在脚本中调用这些程序,并传递相应的参数完成exchange,queue的创建以及对应的绑定操作。

其实通过rabbitmq本身提供的rabbitmqctl命令,同样能完成exchange和queue的创建,例如:

rabbitmqctl eval 'rabbit_exchange:declare({resource, <<"/">>, exchange, <<"test-topic">>}, topic, true, false, false, []).'

rabbitmqctl eval 'rabbit_amqqueue:declare({resource, <<"/">>, queue, <<"test-queue">>}, true, false, [], none).'

rabbitmqctl eval 'rabbit_binding:add({binding, {resource, <<"/">>, exchange, <<"test-topic">>}, <<"*.com.cn">>, {resource, <<"/">>, queue, <<"test-queue">>}, []}).'
这三条命令执行后的最终结果是:在 / 虚拟主机下创建了topic类型的,持久化的,名为 test-topic的exchange,创建了持久化的,名为 test-queue 的queue,该队列以 *.com.cn 的routing key绑定到了 test-topic这个exchange上。

=================================================================

对于 rabbitmqctl eval 官网的文档里解释是:计算任意的erlang表达式的值。

其实知道一点erlang语法的,一眼就可以看出上面的例子里,其实就是一个Module:Function(Arg)的调用。

这里需要注意:括号后的那个 . 可别忘了。

那么了解了这些后,剩下的就是exchange,queue创建及绑定动作应该调用哪个模块的哪个函数导出函数,参数的意义和格式是怎样的。

exchange的创建调用rabbit_exchange的declare函数,该函数具体声明为:

declare(XName, Type, Durable, AutoDelete, Internal, Args).

XName:      exchange的名称, 具体格式为 {resource, VHost, exchange, Name}
            VHost为虚拟主机的名称
            Name为exchange的名称
            注意 VHost 和 Name 限定为binary形式, 即<<>>
Type:       exchange的类型, 可选值为 direct, headers, topic, fanout
Durable:    是否需要持久化,  true表示持久化, false为非持久化
AutoDelete: 是否自动删除, true表示自动删除, false为非自动删除
Internal:   是否为rabbitmq内部使用, true表示是内部使用, false表示不是内部使用
Args:       exchange的其他选项参数, 一般设置为 []
补充说明:

自动删除的触发条件是:当绑定到该exchange上的所有queue和exchange都已经解除绑定时,rabbitmq自动删除该exchange。

内部使用是指:客户端不能直接向该exchange投递消息,只能由rabbitmq自己向这个exchange投递消息,一般用于exchange到exchange的绑定。另外,rabbitmq的trace机制使用的exchange也是internal类型。

queue的创建应调用rabbit_amqqueue模块的declare函数,该函数具体声明为:

declare(QueueName, Durable, AutoDelete, Args, Owner).

QueueName:  queue的名称, 具体格式为 {resource, VHost, queue, Name}
            VHost为虚拟主机的名称, Name为queue的名称
Durable:    是否需要持久化,  true表示持久化, false为非持久化
AutoDelete: 是否自动删除, true表示自动删除, false为非自动删除
Args:       queue的其他选项参数, 包括消息的优先级, ttl, 队列的最大长度等, 一般设置为 []
Owner:      用于queue的独占模式, 一般设置为 none


创建绑定关系是调用rabbit_binding模块的add函数,该函数具体声明为:
add(Binding)

Binding:  绑定关系, 可以是exchange到exchange, 也可以是exchange到queue

具体格式为 {binding, Source, Key, Destination, Args}
Source 为 消息源, 必须为exchange:  {resource, VHost, exchange, Name}
Key 为 routing-key
Destination 为目的 {resource,VHost,exchange,XName} 或者 {resource, VHost, queue, QName}
Args 为其他选项参数, 一般设置为 []


回过头来再看看前面例子中的命令,应该就不陌生了:)

=====================================================

总结:通过rabbitmqctl eval可以在命令行模式下完成exchange,queue的创建及绑定操作。这样配合shell脚本能较好的达到自动化的方式。



转载于:https://my.oschina.net/hncscwc/blog/345546

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值