【问题标题】:Spark Framework: Listen for server stopSpark 框架:监听服务器停止
【发布时间】:2018-04-19 15:15:52
【问题描述】:

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

【问题讨论】:

    标签: java elasticsearch jetty spark-framework


    【解决方案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);
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-05
        • 2023-03-14
        • 2013-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-18
        • 1970-01-01
        相关资源
        最近更新 更多