Intellij Vertx调试重启竞争条件

时间:2016-04-03 02:22:26

标签: intellij-idea gradle vert.x

我使用Intellij调试运行Vert.X 3应用程序几乎有50%的时间,当我按下重启按钮时,我收到此错误:

我按此按钮重建/重启应用程序:

restart image button

Apr 02, 2016 7:17:03 PM io.vertx.core.http.impl.HttpServerImpl SEVERE: java.net.BindException: Address already in use

这意味着调试器没有杀死端口并在它准备好之前再次启动它。它变化很大。

我的gradle调试非常简单,我已经检查了仅限单实例选项。

intellij gradle debug configuration

有没有人知道如何在不引起这种竞争条件的情况下重新调试运行?

2 个答案:

答案 0 :(得分:4)

您的Verticle必须使用Future版本覆盖停止功能。

类似的东西:

public void stop(Future<Void> future) {
     httpServer.close(ar -> {
        if (ar.succeeeded()) { future.complete(); }
        else {
         future.fail(ar.cause());
        }
     });
}

答案 1 :(得分:3)

您是否正在关闭HTTPServer&amp; Verticle正确并在完成所有操作后向Vertx发出信号?

我有同样的问题(虽然在测试中),但通过正确关闭我的服务器和Verticle来解决它。

以下是一些示例代码(使用Rx版本)

    @Override
    public void stop(Future<Void> stopFuture) {

        httpServer.closeObservable()
                .subscribe(
                        aVoid -> {
                        },
                        error -> {
                            logger.error("Could not shutdown HTTP Server ", error);
                            stopFuture.fail(error);
                        },
                        () -> {
                            logger.info("HTTP Server Shutdown");
                            stopFuture.complete();
                        });
    }