Dropwizard: How to stop service programmatically

夙愿已清 提交于 2019-11-30 17:53:19

You can start the service in new thread, once the test ends the service will shutdown automatically.

However starting in dropwizard 0.6.2 the dropwizard-testing module contains a junit rule exactly for this use case (see here).

Usage of this rule will look something like this:

Class MyTest {

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

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

Keep the environment variable around and add the following method to your application:

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

Now you can call myService.stop() to stop the server.

Thanks @LiorH for this great suggestion.

Here is a complete test class using the DropwizardServiceRule in dropwizard-0.6.2.

First create a service configuration for testing: testing-server.yml and place it in the test's class path (ex. src\test\resources). This way you can set different ports for the test service to use:

http:
  port: 7000
  adminPort: 7001

A simple test class that checks if there is a resource at the location "/request" looks like this:

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));
    }
}

I have also added the import in case you do not know what implementation to choose.

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;

At the end of the tests, the server will shutdown gracefully, so you do not need to worry about it.

you can try using stop() method of org.eclipse.jetty.server.Server, which is internally used by Dropwizard.

Or you use this java feature in your main/constructor ...:

    // 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));
        }
    });
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!