Сброс RabbitMQ-узла для интеграционного тестирования - PullRequest
0 голосов
/ 08 июля 2019

Я использую RabbitMQ в проекте и запускаю свои интеграционные тесты. Так как тесты должны быть независимы друг от друга, я бы сбрасывал экземпляр RabbitMQ перед каждым тестом и в настоящее время решаю эту проблему путем перезапуска (автоматически созданного) док-контейнера RabbitMQ. Однако это очень медленно (для интеграционных тестов).

Я знаю из этого ответа , что можно сбросить экземпляр rabbitmq с помощью rabbitmqctl stop && rabbitmqctl reset && rabbitmqctl start - но в случае docker-образа сигнал остановки убивает основной процесс контейнера (т.е. rabbitmq -server), что в свою очередь приводит к тому, что dockerd уничтожает весь контейнер.

Единственное решение, которое я нашел до сих пор, это запуск модуля управления API, перебор всех очередей, обменов, политик и т. Д. И удаление их через него, что, в свою очередь, также требует времени и требует модуля управления. бежать.

Можно ли программно сбросить работающий узел rabbitmq через AMQP, какую-либо другую конечную точку API или запустить команду, не останавливая ее сначала?

1 Ответ

2 голосов
/ 08 июля 2019

Ответ, на который вы ссылаетесь, верен в том смысле, что вы должны использовать stop_app, а не stop, как в вашем сообщении.

Между ними есть важное различие:

  • stop:

    ... останавливает RabbitMQ и его среду выполнения (Erlang VM)

  • stop_app:

    ... останавливает приложение RabbitMQ, оставляя запущенной среду выполнения (Erlang VM)

Поскольку в контейнере rabbitmq, содержащем Erlang VM, значение равно PID = 1, его остановка, очевидно, приведет к остановке контейнера. К счастью, авторы rabbitmq добавили команду stop_app специально для улучшения опыта пользователя, связанного с тестированием.

Код из ответа, на который вы ссылаетесь, должен работать просто отлично. Вот тот же код, что и в одной строке:

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