【发布时间】:2018-04-19 15:15:52
【问题描述】:
有没有办法在 Spark 框架关闭时进行监听以运行一些清理工作?例如,我想关闭我的 ElasticSearch 客户端。
【问题讨论】:
标签: java elasticsearch jetty spark-framework
有没有办法在 Spark 框架关闭时进行监听以运行一些清理工作?例如,我想关闭我的 ElasticSearch 客户端。
【问题讨论】:
标签: java elasticsearch jetty spark-framework
正如@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);
【讨论】:
一种方法是使用Runtime.getRuntime().addShutdownHook()。
这是程序退出时运行代码的通用 Java 机制。由于 Spark 框架 Web 应用程序只是一个普通的 Web 应用程序,因此它可以工作。见the Java documentation。
但是,如果使用 Unix 上的 SIGKILL 信号或 Microsoft Windows 上的 TerminateProcess 调用中止 VM 进程,则不会运行此挂钩。请注意,这适用于在大多数 IDE 中按下“停止”按钮。
【讨论】: