Назначение и поведение init () в классе Vertx - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть следующая вертикаль для целей тестирования:

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 развернут из основной вертикуции с помощью

  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
                   }
                 });

Этот код работает нормально.

Я посмотрел документацию Verticle и обнаружил метод обратного вызова init(), которого раньше не видел.Поскольку документация мало говорит о том, что она на самом деле делает, я определил ее, чтобы увидеть, где в жизненном цикле вертикали она вызывается.

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

Однако, когда определено init(), я получаюjava.lang.NullPointerException на линии, где я звоню JsonObject cnf = config(); в 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)

Мои вопросы:

Q1 : любая подсказка, почему NullPointerException брошен?

Q2 : какова цель init()?Является ли он внутренним для Vertx или его можно реализовать с помощью клиентского кода, например, для определения некоторых полей в объектах вертикали, передаваемых в конфигурации развертывания?

1 Ответ

0 голосов
/ 08 февраля 2019

Метод init предназначен для внутреннего использования и задокументирован как таковой в Javadoc.Вот исходный код:

  /**
   * 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;
  }

Если init задокументировано в какой-либо пользовательской документации, это ошибка, пожалуйста, сообщите об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...