JavaSpark框架:侦听服务器停止 4 月,1 周 Questions & Answers 1215 是否有一种方法可以在Spark framework关闭时监听,以运行一些清理?例如,我想关闭我的ElasticSearch客户端
# 1 楼答案 正如@Martin Eden所解释的,一种方法是使用Runtime.getRuntime().addShutdownHook(...);,但这与spark服务器(jetty)生命周期无关。实际上,您可以在不停止应用程序的情况下停止服务器,并且这个关闭钩子不会运行添加到runtime的任何钩子清理。因此,如果你停止应用程序,它将清理你的应用程序 另一个选项是在Jetty中添加一个生命周期(托管)bean,并将属性stop at shutdown设置为trueserver.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);
# 2 楼答案 一种方法是使用Runtime.getRuntime().addShutdownHook() 这是一种通用的Java机制,用于在程序退出时运行代码。因为Spark框架web应用程序只是一个普通的web应用程序,所以它可以正常工作。见the Java documentation 但是,如果使用Unix上的SIGKILL信号或Microsoft Windows上的TerminateProcess调用中止VM进程,则不会运行此挂钩。请注意,这适用于在大多数IDE中按下“停止”按钮
# 1 楼答案
正如@Martin Eden所解释的,一种方法是使用
Runtime.getRuntime().addShutdownHook(...);
,但这与spark
服务器(jetty)生命周期无关。实际上,您可以在不停止应用程序的情况下停止服务器,并且这个关闭钩子不会运行添加到runtime
的任何钩子清理。因此,如果你停止应用程序,它将清理你的应用程序另一个选项是在Jetty中添加一个生命周期(托管)bean,并将属性stop at shutdown设置为true
server.setStopAtShutdown(true);
如果未设置停止关闭,则可以在spark服务停止时进行注册:
# 2 楼答案
一种方法是使用
Runtime.getRuntime().addShutdownHook()
这是一种通用的Java机制,用于在程序退出时运行代码。因为Spark框架web应用程序只是一个普通的web应用程序,所以它可以正常工作。见the Java documentation
但是,如果使用Unix上的SIGKILL信号或Microsoft Windows上的TerminateProcess调用中止VM进程,则不会运行此挂钩。请注意,这适用于在大多数IDE中按下“停止”按钮