当前位置: 首页 > news >正文

游戏网站策划书seo怎样

游戏网站策划书,seo怎样,adobe可以做网站吗,wordpress virtualbox功能描述 DubboBootstrap是Dubbo的启动类,包含服务启动、初始化、预处理配置、销毁清理等核心功能 功能分析 核心DubboBootstrap类分析 主要成员变量分析 private static volatile DubboBootstrap instance; //缓存者启动类的实例对象,以static形式…

功能描述

  • DubboBootstrap是Dubbo的启动类,包含服务启动、初始化、预处理配置、销毁清理等核心功能

功能分析

核心DubboBootstrap类分析

主要成员变量分析

private static volatile DubboBootstrap instance; //缓存者启动类的实例对象,以static形式存储,便于其它类调用private final AtomicBoolean awaited = new AtomicBoolean(false); //是否等待private final Lock lock = new ReentrantLock();private final Condition condition = lock.newCondition();private final Lock destroyLock = new ReentrantLock(); //销毁清理时用到的锁private final ExecutorService executorService = newSingleThreadExecutor();private final EventDispatcher eventDispatcher = EventDispatcher.getDefaultExtension(); //事件派发器private final ExecutorRepository executorRepository = getExtensionLoader(ExecutorRepository.class).getDefaultExtension(); //线程池仓库private final ConfigManager configManager; //配置管理器private final Environment environment;private ReferenceConfigCache cache; //引用配置的缓存对象private volatile boolean exportAsync; //是否异步暴露private volatile boolean referAsync; //是否异步引用private AtomicBoolean initialized = new AtomicBoolean(false); //初始化标识private AtomicBoolean started = new AtomicBoolean(false); //启动标识private AtomicBoolean ready = new AtomicBoolean(true); //是否已经准备好环境private AtomicBoolean destroyed = new AtomicBoolean(false);private volatile ServiceInstance serviceInstance; //服务实例private volatile MetadataService metadataService; //元数据服务private volatile Set<MetadataServiceExporter> metadataServiceExporters;private List<ServiceConfigBase<?>> exportedServices = new ArrayList<>(); //已经暴露的服务列表private List<Future<?>> asyncExportingFutures = new ArrayList<>(); //异步暴露时使用的Future列表

主要成员方法分析

获取DubboBootstrap的实例对象

public static DubboBootstrap getInstance() { //获取实例(使用单例模式)if (instance == null) {synchronized (DubboBootstrap.class) {if (instance == null) { //synchronized + 双重检查,线程安全且缩小锁的范围instance = new DubboBootstrap();}}}return instance;
}

私有的构造函数

private DubboBootstrap() { //私有的构造函数configManager = ApplicationModel.getConfigManager(); //config对象的本地配置environment = ApplicationModel.getEnvironment();     //获取环境信息DubboShutdownHook.getDubboShutdownHook().register();ShutdownHookCallbacks.INSTANCE.addCallback(new ShutdownHookCallback() { //注册钩子函数,当容器停止时,对DubboBootstrap进行销毁处理@Overridepublic void callback() throws Throwable {DubboBootstrap.this.destroy();}});
}

做初始化

public void initialize() { //初始化if (!initialized.compareAndSet(false, true)) {return; //此处initialized为true时进入,表明是已经初始化过来,就不在初始化}ApplicationModel.initFrameworkExts(); //初始化框架配置startConfigCenter(); //启动配置中心(拉取远程的配置写到本地缓存中)loadRemoteConfigs(); //加载远程配置(包含RegistryConfig、ProtocolConfig)、并写到ConfigManager对应的缓存中checkGlobalConfigs(); //检查Config是否正确startMetadataCenter(); //启动元数据中心initMetadataService(); //创建MetadataService实例(通过SPI接口WritableMetadataService的实例创建)initMetadataServiceExports(); //创建MetadataServiceExporter实例的集合initEventListener(); //将当前对象作为监听器加入到缓存中的监听器列表if (logger.isInfoEnabled()) {logger.info(NAME + " has been initialized!");}
}

启动服务

public DubboBootstrap start() {if (started.compareAndSet(false, true)) {ready.set(false); //设置标志值initialize();//初始化处理if (logger.isInfoEnabled()) {logger.info(NAME + " is starting...");}exportServices(); //暴露服务if (!isOnlyRegisterProvider() || hasExportedServices()) {exportMetadataService(); //暴露元数据registerServiceInstance(); //注册服务到注册中心}referServices(); //引用服务if (asyncExportingFutures.size() > 0) { //服务异步暴露后,更新启动标志new Thread(() -> {try {this.awaitFinish(); //阻塞着等待异步任务完成} catch (Exception e) {logger.warn(NAME + " exportAsync occurred an exception.");}ready.set(true);if (logger.isInfoEnabled()) {logger.info(NAME + " is ready.");}}).start();} else { //服务同步暴露后,更新启动标志ready.set(true);if (logger.isInfoEnabled()) {logger.info(NAME + " is ready.");}}if (logger.isInfoEnabled()) { //dubbo启动完成的日志logger.info(NAME + " has started.");}}return this;
}

做销毁清理

public void destroy() { //做销毁清理工作(包含关联的注册信息、元数据信息、暴露服务信息等)if (destroyLock.tryLock()) { //尝试加锁做清理,保证线程安全try {DubboShutdownHook.destroyAll(); //停机钩子线程做销毁工作if (started.compareAndSet(true, false)&& destroyed.compareAndSet(false, true)) { //在服务已启动且未销毁时,才做清理unregisterServiceInstance(); //会发起远程调用,取消注册的服务,比如若注册中心为zookeeper,则会通过curator,取消注册的服务unexportMetadataService(); //取消元数据暴露unexportServices(); //从ConfigMananer移除暴露的服务缓存unreferServices(); //取消服务引用destroyRegistries(); //销毁注册实例(即关闭注册中心客户端,以及移除注册实例在本地的缓存)DubboShutdownHook.destroyProtocols(); //销毁所有协助,并释放协议所在的资源destroyServiceDiscoveries(); //移除服务实例,即ServiceDiscovery实例clear(); //清除配置信息shutdown(); //停止运行中的线程池release(); //唤醒所有线程,将该执行的任务执行完,然后再做释放处理}} finally {destroyLock.unlock();}}
}

关联GenericEventListener类分析

主要成员变量分析

private final Method onEventMethod; //onEvent(Event)方法对应的Methodprivate final Map<Class<?>, Set<Method>> handleEventMethods; //维护着事件与事件触发的方法的关系
  • 代码解析:GenericEventListener是事件监听器,维护着事件以及触发事件的方法

主要成员方法分析

查找处理事件的方法

private Map<Class<?>, Set<Method>> findHandleEventMethods() {Map<Class<?>, Set<Method>> eventMethods = new HashMap<>();of(getClass().getMethods()).filter(this::isHandleEventMethod) //过滤出符合条件处理事件的方法.forEach(method -> {Class<?> paramType = method.getParameterTypes()[0];Set<Method> methods = eventMethods.computeIfAbsent(paramType, key -> new LinkedHashSet<>());methods.add(method);});return eventMethods;
}

执行事件对应的方法

public final void onEvent(Event event) { Class<?> eventClass = event.getClass();handleEventMethods.getOrDefault(eventClass, emptySet()).forEach(method -> {ThrowableConsumer.execute(method, m -> {m.invoke(this, event); //依次执行事件关联的方法});});
}

关联EventListener接口分析

@SPI
@FunctionalInterface
public interface EventListener<E extends Event> extends java.util.EventListener, Prioritized { //事件监听器void onEvent(E event); //事件处理static Class<? extends Event> findEventType(Class<?> listenerClass) { //根据监听器Class查找对应的事件Class(就是查找 EventListener<E extends Event> 中的泛化类型)Class<? extends Event> eventType = null;if (listenerClass != null && EventListener.class.isAssignableFrom(listenerClass)) { //isAssignableFrom判断一个类或接口是否是另一个类超类或父接口eventType = findParameterizedTypes(listenerClass).stream().map(EventListener::findEventType) //找到事件的实际类型.filter(Objects::nonNull).findAny().orElse((Class) findEventType(listenerClass.getSuperclass())); //若都没找到,则找它的父类对应的事件类型}return eventType;}static Class<? extends Event> findEventType(ParameterizedType parameterizedType) { //根据参数化的类型找到事件类型Class<? extends Event> eventType = null;Type rawType = parameterizedType.getRawType(); //获取泛型参数if ((rawType instanceof Class) && EventListener.class.isAssignableFrom((Class) rawType)) { //泛型参数为EventListener进行处理Type[] typeArguments = parameterizedType.getActualTypeArguments(); //获取实际的参数列表for (Type typeArgument : typeArguments) {if (typeArgument instanceof Class) {Class argumentClass = (Class) typeArgument;if (Event.class.isAssignableFrom(argumentClass)) { //找到类型为Event的参数eventType = argumentClass;break;}}}}return eventType;}
}
  • 代码解析:EventListener是SPI接口,也是函数式接口,通过事件监听处理对应的事件,类似Handle处理类。该接口继承了java中EventListener,因为所有事件监听器接口都必须扩展的标记接口EventListener。

问题点答疑

  • DubboBootstrap主要负责启动加载哪些信息?是从哪里进入到DubboBootStrap类的?

    • 解答:执行逻辑在DubboBootstrapApplicationListener#onApplicationContextEvent中,也就是在spring容器启动后监听容器发布的时间,里面有调用dubboBootstrap.start(); dubbo服务的启动方法
  • DubboBootstrap怎么实现优雅停机?

    • 解答:通过在创建DubboBootstrap实例时注册钩子函数,当容器停止时,对DubboBootstrap进行销毁处理,会将相关的清理操作处理,所有的任务处理完,才会关闭服务。
  • java.util.EventListener的功能用途是啥?

    • 解答:java中EventListener是一个标记接口,java规定所有的事件都要继承该接口。
  • 停机时ShutdownHookCallbacks#addCallback,是怎么进入此处的回调方法的?

    • 解答:在DubboShutdownHook#run线程被执行时,就会执行回调方法ShutdownHookCallbacks#callback,会依次执行已经注册的List钩子回调接口的callback方法

归纳总结

  • DubboBootstrap类是Dubbo的启动类,主要功能包括:
    • Config配置初始化以及合法性检查
    • 服务启动、服务注册、服务引用
    • 注册钩子、服务销毁时做清理

文章转载自:
http://cyp.zfqr.cn
http://aeroflot.zfqr.cn
http://propitious.zfqr.cn
http://macrocephaly.zfqr.cn
http://excrescency.zfqr.cn
http://momentary.zfqr.cn
http://circumambient.zfqr.cn
http://galleon.zfqr.cn
http://parakeet.zfqr.cn
http://outreach.zfqr.cn
http://pionic.zfqr.cn
http://bcc.zfqr.cn
http://interdependence.zfqr.cn
http://barebacked.zfqr.cn
http://forereach.zfqr.cn
http://impertinence.zfqr.cn
http://skeeter.zfqr.cn
http://effraction.zfqr.cn
http://microwatt.zfqr.cn
http://armipotence.zfqr.cn
http://samnium.zfqr.cn
http://fisherman.zfqr.cn
http://snaggletoothed.zfqr.cn
http://pauline.zfqr.cn
http://tumtum.zfqr.cn
http://andalusia.zfqr.cn
http://subfloor.zfqr.cn
http://zagazig.zfqr.cn
http://attachment.zfqr.cn
http://sketch.zfqr.cn
http://thunderburst.zfqr.cn
http://vitalize.zfqr.cn
http://prokaryotic.zfqr.cn
http://sprinkler.zfqr.cn
http://midst.zfqr.cn
http://oilpaper.zfqr.cn
http://cineole.zfqr.cn
http://stickleback.zfqr.cn
http://magnipotent.zfqr.cn
http://matrass.zfqr.cn
http://peachick.zfqr.cn
http://imperishably.zfqr.cn
http://murexide.zfqr.cn
http://canadien.zfqr.cn
http://stutter.zfqr.cn
http://astragalomancy.zfqr.cn
http://feudality.zfqr.cn
http://standaway.zfqr.cn
http://gallophilism.zfqr.cn
http://woodenware.zfqr.cn
http://pavulon.zfqr.cn
http://sverdrup.zfqr.cn
http://salutatory.zfqr.cn
http://autoecious.zfqr.cn
http://chut.zfqr.cn
http://soldierlike.zfqr.cn
http://brinell.zfqr.cn
http://rockstaff.zfqr.cn
http://regalvanize.zfqr.cn
http://brazenfaced.zfqr.cn
http://interviewer.zfqr.cn
http://isochroous.zfqr.cn
http://clubwoman.zfqr.cn
http://compliably.zfqr.cn
http://arena.zfqr.cn
http://zamouse.zfqr.cn
http://holmium.zfqr.cn
http://fiberfaced.zfqr.cn
http://semisteel.zfqr.cn
http://concourse.zfqr.cn
http://cdma2000.zfqr.cn
http://pellitory.zfqr.cn
http://bla.zfqr.cn
http://seignory.zfqr.cn
http://theorization.zfqr.cn
http://supremely.zfqr.cn
http://macedonia.zfqr.cn
http://saltine.zfqr.cn
http://susceptibility.zfqr.cn
http://longton.zfqr.cn
http://gairfowl.zfqr.cn
http://transfect.zfqr.cn
http://pedicular.zfqr.cn
http://diuresis.zfqr.cn
http://liposome.zfqr.cn
http://indescribability.zfqr.cn
http://speakerphone.zfqr.cn
http://fulfil.zfqr.cn
http://granulate.zfqr.cn
http://marcionism.zfqr.cn
http://ullmannite.zfqr.cn
http://ostectomy.zfqr.cn
http://guan.zfqr.cn
http://geratologous.zfqr.cn
http://market.zfqr.cn
http://inspiratory.zfqr.cn
http://defluent.zfqr.cn
http://preplan.zfqr.cn
http://dreamy.zfqr.cn
http://microholography.zfqr.cn
http://www.hrbkazy.com/news/59425.html

相关文章:

  • 工商企业快手seo关键词优化
  • 手机好在百度做网站吗搜索引擎优化分析报告
  • 企业取名字中国seo关键词优化工具
  • 口红机网站怎么做百度本地推广
  • 网站后端架构如何做外包seo公司
  • 中国建设银行的业务范围晋城seo
  • 专业旅游网站建设seo优质友链购买
  • 网站开发软件标书范本网络运营好学吗
  • 无锡网站建设技术竞价关键词排名软件
  • 互联网全媒体广告代理外贸seo推广
  • 网站建设const是什么意思疫情死亡最新数据消息
  • 沈阳微信网站建设竞价推广账户托管
  • 南京企业免费建站广东公共广告20120708
  • 搜索引擎优化是指什么意思徐州百度快照优化
  • 真人做爰直播试看网站网页搜索排名提升
  • 房地产活动策划网站网络整合营销的特点有
  • 有关房地产开发建设的网站福州网络推广运营
  • 企业如何在网站做认证互联网推广怎么找渠道
  • 辅助网站建设百度问答怎么赚钱
  • 学生做网站的工作室东莞网络公司电话
  • 专升本要什么条件长沙网站推广排名优化
  • 京东商城网站的搜索引擎营销做的案例分析企业网站推广可以选择哪些方法
  • seo排名软件价格seo平台是什么
  • 昌平区手机网站制作服务seo赚钱吗
  • 导航网站系统个人免费自助建站网站
  • 邯郸做网站服务商谷歌搜索引擎网址
  • 淘宝官方网站登录页面免费域名注册申请
  • 做代收的网站有哪些兰州seo培训
  • 内江规划建设教育网站搭建一个网站的流程
  • 如何用另一个端口做网站百度地图网页版进入