silentbalanceyh/vertx-zero

View on GitHub
vertx-gaia/vertx-ams/src/main/qas/io/horizon/specification/boot/HLauncher.java

Summary

Maintainability
A
0 mins
Test Coverage
package io.horizon.specification.boot;

import io.horizon.exception.web._501NotImplementException;
import io.macrocosm.specification.boot.HOff;
import io.macrocosm.specification.boot.HOn;
import io.macrocosm.specification.boot.HRun;
import io.macrocosm.specification.config.HConfig;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.function.Consumer;

/**
 * 「启动器」专用接口
 * 用于主启动容器,主启动容器的类型为泛型,可以帮助系统启动完成,主容器生命周期很简单
 * <pre><code>
 *     - start:启动
 *     - stop:停止
 *     - refresh:刷新
 *     - restart:重启
 * </code></pre>
 * 示例代码通常如下:
 * <pre><code>
 *     HLauncher launcher = ...;
 *     launcher.start(server -> {
 *         // 真正的启动周期,之前可以针对 server 做相关调整以及配置
 *     });
 * </code></pre>
 *
 * 所有在启动之前和停止之后的动作都在实现类内部处理,而保证实现类的自由度,如:
 * <pre><code>
 *     1. 配置文件加载
 *     2. 准备类加载器
 *     3. 调用 Google Guice 启动IoC
 *     4. 准备文件和配置缓存
 *     5. 启动数据库连接池
 *     4. Metadata仓库基础配置
 * </code></pre>
 * 即:{@link HLauncher} 的每个行为的回调函数才是整个容器Ready之后刚刚创建的过程,内部实现全部放到实现类中。
 * <pre><code>
 *     1. 主容器种类
 *        - SM模式:OSGI Launcher -> Bundle ( Jetty )
 *        - Zero模式:Zero Launcher -> Vertx
 *        - Aeon模式:Aeon Launcher -> HAeon
 *     2. 辅助组件
 *        生命周期辅助组件为启动新规范,为了让启动器在每个生命周期多一层,且启动组件会
 *        跟随启动器的启动而启动,跟随启动器的停止而停止,所以此处的启动器需要提供一个
 *        完整的生命周期组件处理和启动相关的事情
 *        - on:{@link HOn} 启动组件
 *        - off:{@link HOff} 停止组件
 *        - run: {@link HRun} 运行组件
 * </code></pre>
 *
 * @author lang
 */
public interface HLauncher<WebServer> {
    /**
     * 启动服务器,由于此处在实现层会处理内置的配置模型,之所以使用 void 的返回值主要是
     * 考虑到启动过程中可能存在异步调用所以 void 可以保证通过 callback 的写法处理所有
     * 异步行为而不影响主逻辑,由于此类是入口类,所以此处根据最新的启动器规范进行修订,以保证
     *
     * @param on     服务器配置消费(容器启动之前)
     * @param server 服务器消费器(容器启动之后)
     */
    <WebConfig extends HConfig> void start(HOn<WebConfig> on, Consumer<WebServer> server);

    /**
     * 停止服务器,由于此处在实现层会处理内置的配置模型,所以使用回调模式 Consumer 来完
     * 成真正意义的启动,AOP这一层直接放到启动器停止后
     *
     * @param off    服务器配置消费(容器停止之前)
     * @param server 服务器消费器(容器停止之后)
     */
    <WebConfig extends HConfig> void stop(HOff<WebConfig> off, Consumer<WebServer> server);

    /**
     * 重启服务器
     *
     * @param run    服务器重启准备
     * @param server 服务器引用
     */
    default <WebConfig extends HConfig> void restart(final HRun<WebConfig> run, final Consumer<WebServer> server) {
        throw new _501NotImplementException(this.getClass());
    }

    /**
     * 刷新服务器(热部署模式)
     *
     * @param run    服务器刷新准备
     * @param server 服务器引用
     */
    default <WebConfig extends HConfig> void refresh(final HRun<WebConfig> run, final Consumer<WebServer> server) {
        throw new _501NotImplementException(this.getClass());
    }

    /**
     * 节点模式的服务器专用
     *
     * @return 服务器存储
     */
    default ConcurrentMap<String, WebServer> store() {
        return new ConcurrentHashMap<>();
    }
}