有没有办法监听 Spark 框架何时关闭并运行一些清理工作?例如,我想关闭我的 ElasticSearch 客户端。
问问题
1249 次
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 回答