添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I have the following verticle for testing purposes:

public class UserVerticle extends AbstractVerticle {
  private static final Logger log = LoggerFactory.getLogger(UserVerticle.class);
  @Override
  public void start(Future<Void> sf) {
    log.info("start()");
    JsonObject cnf = config();
    log.info("start.config={}", cnf.toString());
    sf.complete();
  @Override
  public void stop(Future<Void> sf) {
    log.info("stop()");
    sf.complete();
  private void onMessage(Message<JsonObject> message) { ... }
    log.info("onMessage(message={})", message);

Is is deployed from the main verticle with

  vertx.deployVerticle("org.buguigny.cluster.UserVerticle",
                 new DeploymentOptions()
                 .setInstances(1)
                 .setConfig(new JsonObject()
                        .put(some_key, some_data)
                 ar -> {
                   if(ar.succeeded()) {
                     log.info("UserVerticle(uname={}, addr={}) deployed", uname, addr);
                     // continue when OK
                   else {
                     log.error("Could not deploy UserVerticle(uname={}). Cause: {}", uname, ar.cause());
                     // continue when KO

This code works fine.

I had a look at the Verticle documentation and discovered an init() callback method I didn't see before. As the documentation doesn't say much about what it really does, I defined it to see where in the life cycle of a verticle it gets called.

  @Override
  public void init(Vertx vertx, Context context) {
    log.info("init()");
    JsonObject cnf = context.config();
    log.info("init.config={}", cnf.toString());

However, when init() is defined I get a java.lang.NullPointerException on the line where I call JsonObject cnf = config(); in start():

java.lang.NullPointerException: null
    at io.vertx.core.AbstractVerticle.config(AbstractVerticle.java:85)
    at org.buguigny.cluster.UserVerticle.start(UserVerticle.java:30)
    at io.vertx.core.impl.DeploymentManager.lambda$doDeploy$8(DeploymentManager.java:494)
    at io.vertx.core.impl.ContextImpl.executeTask(ContextImpl.java:320)
    at io.vertx.core.impl.EventLoopContext.lambda$executeAsync$0(EventLoopContext.java:38)
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:462)
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:897)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.lang.Thread.run(Thread.java:748)

My questions are:

Q1 : any clue why NullPointerException is thrown?

Q2 : what is the purpose of init()? Is it internal to Vertx or can it be be implemented by client code to, for example, define some fields in the verticle objects passed in deployment config ?

The init method is for internal usage and documented as such in the Javadoc. Here's the source code:

* Initialise the verticle.<p> * This is called by Vert.x when the verticle instance is deployed. Don't call it yourself. * @param vertx the deploying Vert.x instance * @param context the context of the verticle @Override public void init(Vertx vertx, Context context) { this.vertx = vertx; this.context = context;

If init is documented in any user documentation it's a mistake, please report it.

Ok, then it's clear. init() doc is in the javadocs with almost the same text as start(): Start the verticle instance. Vert.x calls this method when deploying the instance. You do not call it yourself. Hence my confusion. Thanks. – mszmurlo Feb 9, 2019 at 4:13

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.