Изящная остановка встроенного сервера Jetty при выдаче команды kill в Linux - PullRequest
0 голосов
/ 01 апреля 2019

В моем встроенном серверном приложении Jetty я хочу закрыть несколько потоков, исполнителей и т. Д. До его уничтожения командой kill -9 в linux. Как мне справиться с этим?

Я заметил, что когда мой джет-сервер работает и я запускаю команду kill -9, в журналах печатаются строки «Killed», и приложение закрывается.

Я уже добавил LifeCycleListener, добавленный в качестве соединителя к серверу, так что, если мой сервер останавливается, я могу выполнить некоторую очистку, прежде чем приложение выйдет из строя. Но это не вызывается в случае kill -9

    server = new Server();
    loadConnectors(server);

    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
    context.setContextPath("/");

    server.setHandler(context);

    ServletHolder jerseyServlet = context.addServlet(ServletContainer.class, "/*");
    jerseyServlet.setInitOrder(0);

    // Tells the Jersey Servlet which REST service/class to load.
    jerseyServlet.setInitParameter("jersey.config.server.provider.classnames", Resources.class.getCanonicalName());

    server.setStopAtShutdown(true); 
    server.start();
    logger.debug("Reached this line");



  private void loadConnectors(Server server) {
    //----Http connection setup------------------
    ServerConnector connector = new ServerConnector(server);
    connector.setPort(9025);
    connector.addLifeCycleListener(new ConnectorListener());
            .....
    }

Ответы [ 3 ]

0 голосов
/ 01 апреля 2019

Вы можете прослушивать KILLSIG 15 (kill -15) только с Runtime.addShutdownHook (), например Runtime.getRuntime().addShutdownHook(new Thread());

0 голосов
/ 01 апреля 2019

Это невозможно, извините.SIGKILL (9) и SIGSTOP (19 для Linux, 23 для Solaris) нельзя игнорировать или перехватывать.

0 голосов
/ 01 апреля 2019

Использование kill -9 всегда приведет к резкому завершению JVM.

Нет ничего, что Jetty может сделать, чтобы обойти это.

Попробуйте вместо этого использовать на своем веб-сервере команду (очевидно, защищенную паролем), которая просто выдаст Server.stop().

Или используйте JMX и и вызовите метод stop() Сервера. (это можно сделать с помощью консоли JMX / браузера JMX / или даже командной строки JMX)

...