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

做京东网站需要哪些手续费wordpress 在线预览

做京东网站需要哪些手续费,wordpress 在线预览,免费小程序怎么赚钱,如何查网站的外链通过深入分析SpringBoot中WebServer的启动流程#xff0c;插入自定义的Loading页面展示逻辑#xff0c;优化软件使用时的用户体验。 背景 Java本身的特点#xff0c;再加上开发人员能力差#xff0c;软件开发工程化程度低等等问题#xff0c;经过一段时间的迭代之后… 通过深入分析SpringBoot中WebServer的启动流程插入自定义的Loading页面展示逻辑优化软件使用时的用户体验。 背景 Java本身的特点再加上开发人员能力差软件开发工程化程度低等等问题经过一段时间的迭代之后经常会出现的一个问题就是应用启动越来越慢。 过往我也是收集了不少相关资料例如 云音乐服务端应用启动时间下降40%实践分享7min到40s SpringBoot 启动优化实践等等。 本文跳出与上述文章类似的技术角度借鉴Jenkins的启动流程 —— Jenkins也是Java开发的而且其启动速度虽然经过不少优化但依然有着非常明显的延迟但Jenkins通过加入Loading页面的方式极大提升了用户在等待系统就绪期间的用户体验 —— 启动之后马上呈现给用户一个Loading页面待后台服务能够正常提供服务之后冲向到常规Index页面。 实现 Jenkins默认适用的是winstone 容器所以我在一开始所设想的拿来主义被掐死在了摇篮里最后经过一番摸索基于SpringBoot Undertow实现了类似的效果。 思路 SpringBoot项目中单单一个WebServer的启动是很快的只是SpringBoot的启动流程里其会在WebServer启动之前初始化所有的Bean而这是整个启动流程里最耗时的。所以我们将在SpringBoot容器中的Bean实例化之前启动我们自定义的minimal Undertow Server来向用户提供对于 loading页面的响应。待Spring容器准备进行WebServer的启动时停止我们的minimal Undertow Server以避免端口占用。前端loading页面将定期轮询后端服务启动情况待其正常响应时跳转到相应的主体服务页面。 直接上代码 // 1. 应用启动入口类// 应用启动入口public static void main(String[] args) {final SpringApplication springApplication new SpringApplication(SpringBootTestApplication.class);// 读取用户配置, 决定启动方式final Boolean humanableStart Convert.toBool(CommonUtil.getProperty(START_HUMANABLE, false));if (humanableStart) {springApplication.setApplicationContextClass(AnnotationConfigServletWebServerApplicationContextEx.class); // 自定义}// 启动Spring容器springApplication.run(args);}// 2. SpringBoot不同版本实现方式不同 // 这里以 SpringBoot 2.3.3为例, 更高版本需要实现 ApplicationContextFactory 接口 class AnnotationConfigServletWebServerApplicationContextWithHumanableStart extends AnnotationConfigServletWebServerApplicationContext {Undertow minimalUndertowserver;Overrideprotected void prepareRefresh() {// 尽量提前minimal Undertow Server的创建, 优化用户体验.String property this.getEnvironment().getProperty(server.port);minimalUndertowserver minimalUndertowserver(Convert.toInt(property));super.prepareRefresh();}Overrideprotected void onRefresh() {// ServletWebServerApplicationContext正是通过覆写本方法来实现 WebServer 创建的// 同时会向容器中注入webServerStartStop Bean借助Spring的生命周期回调接口SmartLifecycle来负责将webServer的开启和关闭;super.onRefresh();}Overrideprotected void finishRefresh() {// 关键流程: AbstractApplicationContext.refresh()// super.finishRefresh()中将触发 WebServerStartStopLifecycle.start() 以启动webserver, 所以我们得在它之前将我们的轻量级webserver关闭掉.minimalUndertowserver.stop();super.finishRefresh();}static Undertow minimalUndertowserver(int port) {// 这个loading.html是从jenkins里扒过来了, 也算是实现了部分拿来主义final String loadingHtml ResourceUtil.readStr(static/loading.html, CharsetUtil.CHARSET_UTF_8);// Start the minimal Undertow serverUndertow undertow Undertow.builder().addHttpListener(port, 0.0.0.0).setHandler(new HttpHandler() {Overridepublic void handleRequest(HttpServerExchange exchange) throws Exception {exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, text/html);exchange.getResponseSender().send(loadingHtml);}}).build();undertow.start();return undertow;} }原理分析 Spring容器之所以启动慢主要原因肯定就是各类Bean的实例化耗时叠加 // AbstractApplicationContext.java // Spring核心启动流程 Override public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// Prepare this context for refreshing.prepareRefresh(); // 我们在这里启动 minimal Undertow Server// Tell the subclass to refresh the internal bean factory.ConfigurableListableBeanFactory beanFactory obtainFreshBeanFactory();// Prepare the bean factory for use in this context.prepareBeanFactory(beanFactory);try {// Allows post-processing of the bean factory in context subclasses.postProcessBeanFactory(beanFactory);// Invoke factory processors registered as beans in the context.invokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.registerBeanPostProcessors(beanFactory);// Initialize message source for this context.initMessageSource();// Initialize event multicaster for this context.initApplicationEventMulticaster();// Initialize other special beans in specific context subclasses.onRefresh();// Check for listener beans and register them.registerListeners();// Instantiate all remaining (non-lazy-init) singletons.finishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.finishRefresh(); // 在这里关闭 minimal Undertow Server.} catch (BeansException ex) {if (logger.isWarnEnabled()) {logger.warn(Exception encountered during context initialization - cancelling refresh attempt: ex);}// Destroy already created singletons to avoid dangling resources.destroyBeans();// Reset active flag.cancelRefresh(ex);// Propagate exception to caller.throw ex;}finally {// Reset common introspection caches in Springs core, since we// might not ever need metadata for singleton beans anymore...resetCommonCaches();}} }相关 Jenkins源码 - loading页面Jenkins源码 - loading后端代码GitHub - jenkinsci-winstone
http://www.hkea.cn/news/14302614/

相关文章:

  • 自己搭服务器 做购物网站成本2022装修简约风格效果图
  • 贵州安顺建设局网站免费追剧永久免费app
  • iis如何发布asp.net网站wordpress 财经插件
  • 深圳优秀网站建设网站建设建材
  • 建站宝盒如何使用纪念馆展厅设计
  • 一 网站建设管理基本情况保险哪家好
  • 巫山集团网站建设一站式快速网站排名多少钱
  • 建网站公司销售广州网站建设鞍山
  • 网站设计怎么保持风格一致平面设计师推荐网站
  • 学校网站建设目的是什么意思免费行情软件app网
  • 滨州哪里有做网站的广州白云做网站
  • 手机网站好还是h5好开建筑公司取名字如何取好旺
  • 广州黄埔做网站的公司国家有规定必须做可信网站验证
  • 做海报 画册的素材网站专业的聊城网站优化
  • 徐州市城乡和住房建设局网站南宁百姓网
  • 深圳品牌网站建设服务费用北美购物网站排名
  • 网站模版建设工具南阳网站建设费用
  • 成功的营销网站企业密信下载app下载官网
  • 网站用户体验设计中国互联网协会什么级别
  • 网站建设价格兴田德润i网址多少微商怎么引流被别人加
  • 做一个网站 如何盈利模式WordPress首页做成插件
  • 网站侧栏设计珠海网站建设排名
  • 视频网站界面设计用老域名做新网站 权重怎么传递
  • 制作营销型网站公司数据库修改wordpress登录密码忘记
  • 佛山微信网站建设多少钱网站建设搜索优化app推广新闻营销
  • 网站开发保密协议模板云南网站建设快速排名
  • 科丰化工东莞网站建设关键词搜索量查询
  • 做搜狗网站优化点成都私人做公司网站的
  • 网站注册空间水利网站建设管理汇报
  • 怎么做最简单的网站做网站比较好的软件