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

时间:2019-07-08 14:28:42

标签: docker rabbitmq integration-testing

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

我从this answer知道可以用rabbitmqctl stop && rabbitmqctl reset && rabbitmqctl start重设rabbitmq-instance-但是在docker-image的情况下,停止信号会杀死主容器进程(rabbitmq-服务器),进而导致dockerd杀死整个容器。

到目前为止,我发现的唯一解决方案是运行management-api-plugin,遍历所有队列,交换,策略等,并通过它们删除它们-这又需要一段时间,并且需要management-plugin运行。

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

1 个答案:

答案 0 :(得分:2)

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

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

  • stop

      

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

  • stop_app

      

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

因为包含Erlang VM的Rabbitmq容器进程为PID = 1,因此停止它显然会导致容器停止。幸运的是,rabbitmq作者added stop_app专门命令improve与测试相关的用户体验。

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

docker exec my_queue sh -c "rabbitmqctl stop_app; rabbitmqctl reset; rabbitmqctl start_app"

输出将如下所示:

$ 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
$