Dropwizard: как программно остановить сервис

Чтобы запустить службу, я знаю, что используется new MyService().run(args). Как остановить его?

Мне нужно начинать и останавливаться программно для setUp() и tearDown() в моих тестах.

Ответ 1

Вы можете запустить службу в новом потоке, как только тест завершится, служба автоматически отключится.

Однако, начиная с dropwizard 0.6.2, модуль тестирования dropwizard содержит правило junit именно для этого варианта использования (см. здесь).

Использование этого правила будет выглядеть примерно так:

Class MyTest {

    @ClassRule
    public static TestRule testRule = new DropwizardServiceRule<MyConfiguration>(MyService.class,
                    Resources.getResource("service.yml").getPath()));

    @Test
    public void someTest(){
    ....

Ответ 2

Сохраните переменную environment и добавьте в приложение следующий метод:

public void stop() throws Exception {
  environment.getApplicationContext().getServer().stop();
}

Теперь вы можете вызвать myService.stop(), чтобы остановить сервер.

Ответ 3

Спасибо @LiorH за это замечательное предложение.

Вот полный тестовый класс с помощью DropwizardServiceRule в dropwizard-0.6.2.

Сначала создайте конфигурацию службы для тестирования: testing-server.yml и поместите ее в путь тестового класса (например, src\test\resources). Таким образом вы можете установить различные порты для службы тестирования:

http:
  port: 7000
  adminPort: 7001

Простой тестовый класс, который проверяет, есть ли ресурс в местоположении "/request", выглядит следующим образом:

class TheServiceTest {

    @ClassRule
    public static DropwizardServiceRule RULE = new DropwizardServiceRule<MyConfiguration>(TheService.class,
            Resources.getResource("testing-server.yml").getPath());

    @Test
    public void
    dropwizard_gets_configured_correctly() throws Exception {
        Client client = new Client();

        ClientResponse response = client.resource(
                String.format("http://localhost:%d/request", RULE.getLocalPort()))
                        .get(ClientResponse.class);

        assertThat(response.getStatus(), is(200));
    }
}

Я также добавил импорт, если вы не знаете, какую реализацию выбрать.

import com.google.common.io.Resources;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.yammer.dropwizard.testing.junit.DropwizardServiceRule;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.rules.TestRule;

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;

В конце тестов сервер будет изящно выключен, поэтому вам не нужно беспокоиться об этом.

Ответ 4

вы можете попробовать использовать метод stop() для org.eclipse.jetty.server.Server, который внутренне используется Dropwizard.

Ответ 5

Или вы используете эту функцию java в своем основном/конструкторе...:

    // In case jvm shutdown
    Runtime.getRuntime().addShutdownHook(new Thread() {
        @Override
        public void run()
        {
            // what should be closed if forced shudown
            // ....

            LOG.info(String.format("--- End of ShutDownHook (%s) ---", APPLICATION_NAME));
        }
    });