Vert.x原始碼分析之Launcher

襄垣發表於2020-04-03

在使用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_NAME, SLF4JLogDelegateFactory.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);
  }
}
複製程式碼

相關文章