Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何等待Spark服务停止?_Java_Spark Java - Fatal编程技术网

Java 如何等待Spark服务停止?

Java 如何等待Spark服务停止?,java,spark-java,Java,Spark Java,对于我的SparkAPI,我正在构建集成测试。有时我想停止并启动Spark实例。当我这样做时,我有时会遇到这样的问题:我正在创建一个新的Spark实例,而旧的实例仍在一个单独的线程上关闭。了解Spark实例何时实际关闭会很有帮助 首先,我启动Spark实例,如下所示: Spark.init(); Spark.awaitInitialization(); Spark.stop(); 然后我就这样停下来: Spark.init(); Spark.awaitInitialization(); S

对于我的SparkAPI,我正在构建集成测试。有时我想停止并启动Spark实例。当我这样做时,我有时会遇到这样的问题:我正在创建一个新的Spark实例,而旧的实例仍在一个单独的线程上关闭。了解Spark实例何时实际关闭会很有帮助

首先,我启动Spark实例,如下所示:

Spark.init();
Spark.awaitInitialization();
Spark.stop();
然后我就这样停下来:

Spark.init();
Spark.awaitInitialization();
Spark.stop();
现在,在我调用
stop()
之后,Spark服务实际上还没有停止


是否有类似于
awaitInitialization()
的功能,或者知道Spark服务何时实际停止的另一种方法?

我使用Spark java构建用于集成/功能测试的模拟服务

我的测试分解代码:

public FakeServer shutdown() {
    service.stop();
    // Remove when https://github.com/perwendel/spark/issues/705 is fixed.
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return this;
}
对我来说,每个测试都可以无缝地在测试前设置FakeServer,并在测试完成后将其删除

试试看

我在中阅读了此解决方案并为我工作:

public static void stopServer() {
        try {
            Spark.stop();
            while (true) {
                try {
                    Spark.port();
                    Thread.sleep(500);
                } catch (final IllegalStateException ignored) {
                    break;
                }
            }
        } catch (final Exception ex) {
            // Ignore
        }
    }

Spark 2.8.0引入了一种
awaitStop()
方法:

如果您停留在以下版本(例如使用spark kotlin,它使用spark 2.6.0),您可以使用一些反射来识别spark的当前状态:

    fun awaitShutdown() {
        Spark.stop()

        while (isSparkInitialized()) {
            Thread.sleep(100)
        }
    }

    /**
     * Access the internals of Spark to check if the "initialized" flag is already set to false.
     */
    private fun isSparkInitialized(): Boolean {
        val sparkClass = Spark::class.java
        val getInstanceMethod = sparkClass.getDeclaredMethod("getInstance")
        getInstanceMethod.isAccessible = true
        val service = getInstanceMethod.invoke(null) as Service

        val serviceClass = service::class.java
        val initializedField = serviceClass.getDeclaredField("initialized")
        initializedField.isAccessible = true
        val initialized = initializedField.getBoolean(service)

        return initialized
    }

(摘自)

这是一个已知的功能缺失,拉取请求中还有一个潜在的修复:。只是澄清一下-2.8.0中引入的方法称为
awaitStop()
,而不是
awaitShutdown()