VertX3 垂直部署:未触发 CompletionHandler

VertX3 verticle deployment: CompletionHandler not triggered

当我运行下面这段代码时:

import io.vertx.core.*;
import io.vertx.core.eventbus.MessageConsumer;
import io.vertx.core.json.JsonObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

class TestVerticle extends AbstractVerticle {
    final Logger logger = LoggerFactory.getLogger(TestVerticle.class.getName());

    public static final String ADDRESS = "oot.test";

    public void start(Future<Void> startFuture) {
        logger.info("starting test verticle");
        MessageConsumer<JsonObject> consumer = vertx.eventBus().consumer(ADDRESS);
        consumer.handler(message -> {
            final JsonObject body = message.body();
            logger.info("received: " + body);
            JsonObject replyMessage = body.copy();
            replyMessage.put("status", "processed");
            message.reply(replyMessage);
        });
        logger.info("started test verticle");
    }
}
public class Scratchpad {
    private final static Logger logger = LoggerFactory.getLogger(Scratchpad.class);

    public static void main(String[] args) throws InterruptedException {
        Vertx vertx = Vertx.vertx();
        logger.info("deploying test verticle");
        Handler<AsyncResult<String>> completionHandler = result -> {
            System.out.println("done");
            if (result.succeeded()) {
                logger.info("deployment result: " + result.result());
            } else {
                logger.error("failed to deploy: " + result);
            }
        };
        TestVerticle testVerticle = new TestVerticle();
        vertx.deployVerticle(testVerticle, completionHandler);

        logger.info("deployment completed");
    }
}

我希望执行 CompletionHandler 内容,因此我应该将某些内容发送到标准输出(至少 "done",尽管日志记录也应该正常工作)但没有任何反应。所有其他日志记录信息都正确显示在我的屏幕上。我做错了什么?

之后:

logger.info("started test verticle");

添加:

startFuture.complete();

请参阅文档中关于 异步启动方法的 Asynchronous Verticle start and stop 部分:

This version of the method takes a Future as a parameter. When the method returns the verticle will not be considered deployed.

Some time later, after you've done everything you need to do (e.g. start other verticles), you can call complete on the Future (or fail) to signal that you're done.