一般来说,exchange和queue都是由我们的业务程序在运行过程中连接到rabbitmq并创建的。然而也有些特殊的场景,要求业务程序在连接使用rabbitmq之前,相关的exchange和queue必须预先创建好。这个时候对于测试人员或者运维人员来说,通常的做法是在rabbitmq安装完成后,启用rabbitmq_management插件,然后在web控制台进行操作来创建exchange和queue,并完成绑定。
比如canal业务需要提前获取mq的连接信息,并建立对应的exchange,否则启动会报错。
所以我们这时候要通过脚本来完成创建exchange和queue和绑定。在参考了很多文章之后开始动手:
###在虚拟主机'/'下创建了 direct 类型的,持久化的,名为 canal_ex 的exchange,
rabbitmqctl eval 'rabbit_exchange:declare({resource, <<"/">>, exchange, <<"canal_ex">>}, direct, true, false, false, []).'
###创建了持久化的,名为 canal_qu 的queue,
rabbitmqctl eval 'rabbit_amqqueue:declare({resource, <<"/">>, queue, <<"canal_qu ">>}, true, false, [], none).'
###队列canal_qu以 canal_key 的routing key绑定到了 canal_ex 这个exchange上。其他参数为默认值.
rabbitmqctl eval 'rabbit_binding:add({binding, {resource, <<"/">>, exchange, <<"canal_ex">>}, <<"canal_key">>, {resource, <<"/">>, queue, <<"canal_qu">>}, []}).'
以上就是创建exchange、queue并绑定的命令,是不是很很简单呢。
新建一个脚本add_canal_exchange.bat
@echo off
cd /d %~dp0rabbitmq_server-3.7.11\sbin##此处是安装目录
rabbitmqctl eval "rabbit_exchange:declare({resource, <<\"/\">>, exchange, <<\"canal_exchange\">>}, direct, true, false, false, [],<<\"admin\">>)."
echo end
双击add_canal_exchange.bat开始运行,结束后进入web控制台查看,结果没有创建对应的exchange。复制命令行进入/安装目录/sbin>,提示'此处不应有<<。',OK,我们重新编辑一下命令:
rabbitmqctl eval "rabbit_exchange:declare({resource, <<\"/\">>, exchange, <<\"canal_ex\">>}, direct, true, false, false, [])."
结果还是不行:
Error:
{:undef, [{:rabbit_exchange, :declare, [{:resource, "/", :exchange, "test-topic"
}, :topic, true, false, false, []], []}, {:erl_eval, :do_apply, 6, [file: 'erl_e
val.erl', line: 680]}, {:rpc, :"-handle_call_call/6-fun-0-", 5, [file: 'rpc.erl'
, line: 197]}]}
有些事情就是一看就会,一做就废。
https://github.com/rabbitmq/rabbitmq-server/issues/1852有相似的问题,那我们看看是怎么解决
3.7.0以后需要添加参数代理用户,那我们再修改一下命令。
rabbitmqctl eval "rabbit_exchange:declare({resource, <<\"/\">>, exchange, <<\"canal_ex\">>}, direct, true, false, false, [],<<\"admin\">>)."
再次运行后成功了,控制台可以看得到我们创建的exchange了,同理创建queue和绑定也都需要添加参数。