【问题标题】:Reset RabbitMQ-node for integration testing重置 RabbitMQ 节点以进行集成测试
【发布时间】:2019-07-08 14:28:42
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: docker rabbitmq integration-testing


    【解决方案1】:

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

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

    • stop:

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

    • stop_app:

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

    因为在包含Erlang VM的rabbitmq容器进程是PID = 1,停止它显然会导致容器停止。幸运的是,rabbitmq 作者addedstop_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
    $ 
    

    【讨论】:

      猜你喜欢
      • 2018-12-23
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多