有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSpark框架:侦听服务器停止

是否有一种方法可以在Spark framework关闭时监听,以运行一些清理?例如,我想关闭我的ElasticSearch客户端


共 (2) 个答案

  1. # 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. # 2 楼答案

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

    这是一种通用的Java机制,用于在程序退出时运行代码。因为Spark框架web应用程序只是一个普通的web应用程序,所以它可以正常工作。见the Java documentation

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