Чтобы начать сервис, я знаю, что один использует new MyService().run(args)
. Как это остановить?Dropwizard: Как остановить сервис программно
Мне нужно запустить и остановиться программно для setUp()
и tearDown()
в моих тестах.
Чтобы начать сервис, я знаю, что один использует new MyService().run(args)
. Как это остановить?Dropwizard: Как остановить сервис программно
Мне нужно запустить и остановиться программно для setUp()
и tearDown()
в моих тестах.
вы можете попробовать использовать метод stop() для org.eclipse.jetty.server.Server, который внутренне используется Dropwizard.
Вы можете запустить сервис в новой ветке, как только тест завершится, служба автоматически отключится.
Однако, начиная с dropwizard 0.6.2, модуль тестирования dropwizard содержит junit rule именно для этого варианта использования (see here).
Использование этого правила будет выглядеть примерно так:
Class MyTest {
@ClassRule
public static TestRule testRule = new DropwizardServiceRule<MyConfiguration>(MyService.class,
Resources.getResource("service.yml").getPath()));
@Test
public void someTest(){
....
Почему они не задокументировали этот класс? (риторический) Как вы узнали об этом, @LiorH? (не риторический) – DavidS
Да, это странно, что это не задокументировано, надеюсь, что его не удастся удалить. Кто-то за работой указал мне этот класс, не знаю, как он его нашел. – LiorH
Привет @LiorH - рад видеть вас здесь! Очень полезно;) – Galz
Спасибо @LiorH за это большое предложение.
Вот полный класс испытаний с использованием DropwizardServiceRule в dropwizard-0.6.2.
Сначала создайте конфигурацию службы для тестирования: testing-server.yml
и поместите ее в путь класса теста (например, src\test\resources
). Таким образом, вы можете установить различные порты для испытания службы для использования:
http:
port: 7000
adminPort: 7001
Простой тест класс, который проверяет, есть ли ресурс на месте «/ запроса» выглядит следующим образом:
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;
В конце испытаний, будет отключен сервер корректно, так что вам не нужно беспокоиться об этом.
Или использовать эту функцию 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));
}
});
Держите переменную environment
вокруг и добавьте следующий метод к приложению:
public void stop() throws Exception {
environment.getApplicationContext().getServer().stop();
}
Теперь вы можете звоните myService.stop()
, чтобы остановить сервер.
Мне было очень полезно остановить приложение DW, если оно работает как служба Windows (например, с помощью Apache Commons Daemon). –
Не могли бы вы указать мне пример кода? Я не понимаю, как это сделать. – Neo