重置 RabbitMQ 节点以进行集成测试

Lar*_*ars 2 integration-testing rabbitmq docker

我在一个项目中使用 RabbitMQ 并针对它运行我的集成测试。由于测试需要相互独立,我想在每次测试之前重置 RabbitMQ 实例,目前通过重新启动(自动创建的)RabbitMQ docker 容器来解决这个问题。但是,这非常慢(对于集成测试)。

我从这个答案中知道可以使用以下命令重置rabbitmq-instance rabbitmqctl stop && rabbitmqctl reset && rabbitmqctl start- 但是在docker-image的情况下,停止信号会杀死主容器进程(即rabbitmq-server),这反过来又会导致dockerd杀死完整的容器。

到目前为止,我找到的唯一解决方案是运行 management-api-plugin,迭代所有队列、交换、策略等,并通过它删除它们 - 这反过来也需要一段时间并且需要 management-plugin 运行。

是否可以通过 AMQP、其他一些 API 端点或运行命令以编程方式重置正在运行的 rabbitmq 节点,而无需先停止它?

gmi*_*ile 5

您所指的答案是正确的,因为您应该使用stop_app,而不是stop像您的消息中那样。

两者之间有一个重要区别:

  • stop

    ...停止 RabbitMQ 及其运行时(Erlang VM)

  • stop_app

    ...停止 RabbitMQ 应用程序,让运行时(Erlang VM)继续运行

因为在包含 Erlang VM is 的 rabbitmq 容器进程中PID = 1,停止它显然会导致容器停止。幸运的是,rabbitmq 作者专门添加了 stop_app命令来改善与测试相关的用户体验。

您所指的答案中的代码应该可以正常工作。这是与单行代码相同的代码:

docker exec my_queue sh -c "rabbitmqctl stop_app; rabbitmqctl reset; rabbitmqctl start_app"
Run Code Online (Sandbox Code Playgroud)

输出将如下所示:

$ docker exec my_queue sh -c "rabbitmqctl stop_app; rabbitmqctl reset; rabbitmqctl start_app"
Stopping rabbit application on node rabbit@40420e95dcee
Resetting node rabbit@40420e95dcee
Starting node rabbit@40420e95dcee
$ 
Run Code Online (Sandbox Code Playgroud)