【每日鲜蘑】Vert.x源码分析之Launcher

12,179 阅读3分钟

在使用Vert.x时,一般先从生命周期下手。而vertx-core提供了默认的io.vertx.core.Launcher实现。

Vert.x 生命周期中的事件

vertx-core包中存在一个interface,名为 VertxLifecycleHooks,可让启动器的子类在发生不同事件时得到通知。

afterConfigParsed

这是Vert.x启动前的钩子,在这个阶段,Vert.xOptions还可以被更新。入参config是通过命令行中的-conf传递进来的参数。

void afterConfigParsed(JsonObject config);

beforeStartingVertx

afterConfigParsed基本相同,参数也可以改变。入参为VertxOptions

void beforeStartingVertx(VertxOptions options);

afterStartingVertx

此时Vert.x的实例已经被创建。

void afterStartingVertx(Vertx vertx);

beforeDeployingVerticle

Verticle被部署之前。

void beforeDeployingVerticle(DeploymentOptions deploymentOptions);

beforeStoppingVertx

Vert.x实例被终止之前。

void beforeStoppingVertx(Vertx vertx);

afterStoppingVertx

Vert.x实例被终止之后。

void afterStoppingVertx();

handleDeployFailed

部署失败时。

void handleDeployFailed(Vertx vertx, String mainVerticle, DeploymentOptions deploymentOptions,
                        Throwable cause);

Vert.x 中的 Launcher

Launcher是 Vert.x 的启动器,实现了VertxLifecycleHooks,但是相关方法的实现大多是空的,我们可以自定义自己的Laucher针对每个事件阶段进行处理。

/**
 * 部署失败时,此方法会被调用。您可以重写此方法来自定义行为。
 * 默认情况下,它关闭`vertx`实例。
 *
 * @param vertx             vert.x 实例
 * @param mainVerticle      verticle
 * @param deploymentOptions verticle 部署参数
 * @param cause             部署失败的原因
 */
public void handleDeployFailed(Vertx vertx, String mainVerticle, DeploymentOptions deploymentOptions, Throwable cause) {
  // 如果部署失败,默认行为是关闭Vert.x
  vertx.close();
}

自定义 Launcher 举例

/**
 * Description: 启动 Launcher .<br>
 *
 * @author m-xy
 *     Created By 2020/4/2 12:14
 */
public class MainLauncher extends Launcher {
  private final static Logger logger = LoggerFactory.getLogger(MainLauncher.class);

  public static void main(String[] args) {
    System.setProperty(LOGGER_DELEGATE_FACTORY_CLASS_NAMESLF4JLogDelegateFactory.class.getName());
    new MainLauncher().dispatch(args);
  }

  /**
   * 启动前准备阶段.
   *
   * @param options 参数
   */
  @Override
  public void beforeStartingVertx(VertxOptions options) {
    logger.info("[Vert.x] Vert.x Options Ready");
    options.setPreferNativeTransport(true);
    super.beforeStartingVertx(options);
  }

  /**
   * Vert.x启动完成阶段.
   *
   * @param vertx
   */
  @Override
  public void afterStartingVertx(Vertx vertx) {
    logger.info("[Vert.x] Starting Vert.x (JVM running for you)");
    super.afterStartingVertx(vertx);
  }

  /**
   * Vert.x停止阶段.
   */
  @Override
  public void afterStoppingVertx() {
    logger.info("[Vert.x] Stopping Vert.x (JVM running for you)");
    super.afterStoppingVertx();
  }

  /**
   * 部署失败时,此方法会被调用。您可以重写此方法来自定义行为。
   * 默认情况下,它关闭`vertx`实例。
   *
   * @param vertx             vert.x 实例
   * @param mainVerticle      verticle
   * @param deploymentOptions verticle 部署参数
   * @param cause             部署失败的原因
   */
  @Override
  public void handleDeployFailed(
    Vertx vertx, String mainVerticle, DeploymentOptions deploymentOptions, Throwable cause) {
    logger.error("[Vert.x] Start Vert.x Failed", cause);
    super.handleDeployFailed(vertx, mainVerticle, deploymentOptions, cause);
  }
}