1

有没有办法监听 Spark 框架何时关闭并运行一些清理工作?例如,我想关闭我的 ElasticSearch 客户端。

4

2 回答 2

1

正如@Martin Eden 解释的那样,一种方法是使用,但这与服务器(码头)生命周期Runtime.getRuntime().addShutdownHook(...);无关。spark实际上,您可以在不停止应用程序的情况下停止服务器,并且此关闭挂钩不会运行添加到runtime. 因此,如果您停止它,这将清理您的应用程序。

另一种选择是在 Jetty 中添加一个生命周期(托管)bean 并将属性 stop at shutdown 设置为 true server.setStopAtShutdown(true);

EmbeddedServers.add(EmbeddedServers.Identifiers.JETTY, new MyJettyFactory());

static class MyJettyFactory implements EmbeddedServerFactory {

      public EmbeddedServer create(Routes routeMatcher, StaticFilesConfiguration staticFilesConfiguration, boolean hasMultipleHandler) {
          MatcherFilter matcherFilter = new MatcherFilter(routeMatcher, staticFilesConfiguration, false, hasMultipleHandler);
          matcherFilter.init(null);

          final Handler handler = new JettyHandler(matcherFilter);

          return new EmbeddedJettyServer((maxThreads, minThreads, threadTimeoutMillis) -> {
            final Server server = new Server();
            server.setStopAtShutdown(true);
            server.setStopTimeout(Duration.of(30, ChronoUnit.SECONDS).toMillis());
            server.addBean(new ManagedObjects(new Managed() {
                @Override
                public void doStart() {

                }

                @Override
                public void doStop() {
                    System.out.println("Good bye!");
                }
            }));
            return server;
        }, handler);

    }
}

如果您没有设置停止关闭,您可以在 spark 服务停止时注册:

final Service ignite = Service.ignite();
Runtime.getRuntime().addShutdownHook(service::stop);
于 2018-04-19T07:15:52.413 回答
0

一种方法是使用Runtime.getRuntime().addShutdownHook().

这是程序退出时运行代码的通用 Java 机制。由于 Spark 框架 Web 应用程序只是一个普通的 Web 应用程序,因此它可以工作。请参阅Java 文档

但是,如果使用 Unix 上的 SIGKILL 信号或 Microsoft Windows 上的 TerminateProcess 调用中止 VM 进程,则不会运行此挂钩。请注意,这适用于在大多数 IDE 中按下“停止”按钮。

于 2017-01-26T13:50:34.317 回答