1

Vert.x v3.5.1。有我start的 Verticle 自定义方法:

@Override
public void start(Future<Void> startFuture) throws Exception {
    startFuture.setHandler(event -> {
        if (event.succeeded()) {
            logger.info("Server started on port: {}", 8080);
        } else {
            logger.warn("Failed to start: {}", event.cause());
        }
    });
    vertx.createHttpServer()
            .requestHandler(router()::accept)
            .listen(8080, event -> {
                if (event.succeeded()) {
                    startFuture.complete();
                } else {
                    startFuture.fail(event.cause());
                }
            });
}

我希望将来完成时会调用我的自定义处理程序。但事实并非如此!在调试模式下,我看到它FutureImpl::setHandler被调用了两次:一次使用我的自定义处理程序,然后使用DeploymentManager's 处理程序 during doDeploy. 所以应用了最新的处理程序。

问题是:是否可以为 Verticle start 指定自定义回调?如果是,我该怎么做?

先感谢您。

4

2 回答 2

1

您不应该更改 startFuture 的处理程序,因为它归调用者所有。很简单,不要那样做 :) 未来是用来表示你已经完成了你的开始代码,而不是定义一旦你完成了应该做什么。

在您的具体示例中,最好在 http 服务器启动后编写日志,然后向 startFuture 指示您已完成代码执行。

@Override
public void start(Future<Void> startFuture) throws Exception {
    vertx.createHttpServer()
         .requestHandler(router()::accept)
         .listen(8080, event -> {
            if (event.succeeded()) {
                logger.info("Server started on port: {}", 8080);
                startFuture.complete();
            } else {
                logger.warn("Failed to start: {}", event.cause());
                startFuture.fail(event.cause());
            }
         });
}
于 2018-04-13T10:22:42.063 回答
0

首先,将您的 Verticle 编写为 AbstractVerticle 扩展。并且不要覆盖start(Future)方法。而是使用start()方法。它将被调用 from AbstractVerticle.start(Future),您可以在Vertx.deployVerticle(verticle, options, future)方法中指定该未来。

例如:

你有一些垂直。在 itstart()方法中只执行初始化任务:

@Override
public void start() throws Exception {
    vertx.eventbus().consume(address, m -> {
       // consumer code skipped
    });
}

和垂直注册:

final DeploymentOptions opts = new DeploymentOptions().setWorker(true);
vertx.deployVerticle(verticle, opts, event -> {
    if (event.succeeded()) {
        log.info("Verticle successfully deployed. DeploymentId: " + event.result());
    } else {
        log.error("Verticle failed to deploy. Cause: " + event.cause().getMessage(), event.cause());
    }
});

就这样 :)

于 2018-04-12T21:15:09.600 回答