2014-09-12 6 views
2

Я пытаюсь придумать микросервис, используя dropwizard. В документации указано, как запустить приложение, но ничего не говорится о его прекращении. Например, apache tomcat имеет как запуск , так и сценарии выключения.Как закрыть приложение dropwizard?

Так кто-нибудь знает, как прекратить применение dropwizard, кроме нажатия Ctrl+C из kill?

+0

Что не так с '^ c'? –

+0

@BoristheSpider AFAIK, если я делаю '^ C', нет гарантии, что сервер причала завершится после обработки всех принятых запросов. Или это?Если да, не могли бы вы указать мне соответствующую документацию? –

ответ

9

Dropwizard Jetty имеет выключатели остановки. Итак, kill -SIGINT <pid> работает очень хорошо.

+0

Отмечено. Это может быть включено в скрипт init.d моей службы drop-wizard –

+0

kill -15 работал лучше для меня. Не знаю, почему. –

2

Я предполагаю, что это не вопрос для вашей среды разработки, а для ваших развертываний. Ответ зависит от стратегии развертывания. Раньше мы обрабатывали развертывания, в которых приложение drop wizard поставляется в виде Java-процесса, который может быть запущен, и pid записывается и принудительно убивает процесс. Или свяжите процесс java в сценарии upstart/init, чтобы изящно запустить и выключить систему.

С другой стороны, когда вы запускаете приложение dropwizard, то в конце концов он запускает причал. http://eureka.ykyuen.info/2010/07/26/jetty-stop-a-jetty-server-by-command. Возможно, это может пролить свет на то, как вы можете передать порт остановки в качестве аргументов при запуске приложения dropwizard.

-3

В Java:

// In case vm 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")); 
    } 
}); 

Создайте свою собственную стратегию, как выключить приложение.

+2

В Dropwizard уже есть эти крючки отключения. –

6

Вдохновленный ответом praveenag, я ворвался в код Jetty.

Если начать DropWizard обеспечение:

-DSTOP.PORT=xxxx -DSTOP.KEY=my_secret_key 

в качестве опции Java,

Он говорит Jetty слушать этот порт для запроса остановки.

Затем вы можете записать в этот сокет, чтобы сообщить Jetty о завершении работы. Я сделал это из R следующим образом:

socket = make.socket("localhost", 8082) 
write.socket(socket, "my_secret_key\r\n") 
write.socket(socket, "stop\r\n") 
close.socket(socket) 

Я думаю, вы можете сделать то же самое с любого другого языка.

1

Другие ответы здесь замечательные, но если вы хотите пойти немного дальше по стеку и легко добавить пользовательскую логику/безопасность/произвольно сложную логику выключения, то добавление крюка выключения с помощью администратора dropwizard Task - хороший шаблон ,

Просто код вашей задачи завершения работы с любой логикой вы хотите

import io.dropwizard.servlets.tasks.Task; 

public class ShutdownTask extends Task { 

    public ShutdownTask() { 
    super("shutdown"); // the task name, used in the endpoint to execute it 
    } 

    public void execute(
    ImmutableMultimap<String, String> immutableMultimap, 
    PrintWriter printWriter 
) throws Exception { 
    // kill the process asynchronously with some nominal delay 
    // to allow the task http response to be sent 
    new Timer().schedule(new TimerTask() { 
     public void run() { 
     // any custom logging/logic here prior to shutdown 
     System.exit(0); 
     } 
    }, 5000); 
    } 
} 

Регистрации задачи в Application.run()

environment.admin().addTask(new ShutdownTask()); 

А затем выполнить его с помощью POST к следующей конечной точке на администратор порта

http://localhost:<ADMIN PORT>/tasks/shutdown