如何做网站优化并快速提高权重视频制作gif表情包

pingmian/2026/1/23 0:05:14/文章来源:
如何做网站优化并快速提高权重,视频制作gif表情包,沈阳做网站的设计公司哪家好,重庆网站seo案例spring 启动进度重新启动企业应用程序时#xff0c;客户打开Web浏览器时会看到什么#xff1f; 他们什么也没看到#xff0c;服务器还没有响应#xff0c;因此Web浏览器显示ERR_CONNECTION_REFUSED 应用程序前面的Web代理#xff08;如果有#xff09;注意到它已关闭客户打开Web浏览器时会看到什么 他们什么也没看到服务器还没有响应因此Web浏览器显示ERR_CONNECTION_REFUSED 应用程序前面的Web代理如果有注意到它已关闭并显示“友好”错误消息 该网站需要永久加载-它接受了套接字连接和HTTP请求但是等待响应直到应用程序实际启动 您的应用程序进行了扩展以便其他节点可以快速接收请求而不会有人通知并且会话始终得以复制 …或应用程序启动速度如此之快以至于没有人注意到任何中断嘿普通的Spring Boot Hello world应用程序从点击java -jar ... [Enter]开始服务请求不到3秒。 顺便说一句请检出SPR-8767启动过程中并行bean初始化 。 处于情况4和5.绝对更好。但是在本文中我们将介绍对情况1和3的更强大的处理。 典型的Spring Boot应用程序会在所有Bean都加载完毕时状态1在最后启动Web容器例如Tomcat。这是一个非常合理的默认值因为它会阻止客户端在完全配置之前无法访问我们的端点。 但是这意味着我们无法区分启动了几秒钟的应用程序和关闭了的应用程序。 因此其想法是要使一个应用程序在加载时显示一些有意义的启动页面类似于显示“ 服务不可用 ”的Web代理。 但是由于此类启动页面是我们应用程序的一部分因此它可能会更深入地了解启动进度。 我们希望在初始化生命周期中更早地启动Tomcat但要保留特殊目的的启动页面直到Spring完全引导为止。 这个特殊页面应该拦截所有可能的请求-因此听起来像一个servlet过滤器。 渴望并尽早启动Tomcat。 在Spring启动servlet容器通过初始化EmbeddedServletContainerFactory创建的实例EmbeddedServletContainer 。 我们有机会使用EmbeddedServletContainerCustomizer截获此过程。 容器是在应用程序生命周期的早期创建的但是在整个上下文完成后才开始创建。 所以我想我将只在自己的定制器中调用start()就是这样。 不幸的是ConfigurableEmbeddedServletContainer没有公开这样的API所以我不得不像这样装饰EmbeddedServletContainerFactory class ProgressBeanPostProcessor implements BeanPostProcessor {//...Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof EmbeddedServletContainerFactory) {return wrap((EmbeddedServletContainerFactory) bean);} else {return bean;}}private EmbeddedServletContainerFactory wrap(EmbeddedServletContainerFactory factory) {return new EmbeddedServletContainerFactory() {Overridepublic EmbeddedServletContainer getEmbeddedServletContainer(ServletContextInitializer... initializers) {final EmbeddedServletContainer container factory.getEmbeddedServletContainer(initializers);log.debug(Eagerly starting {}, container);container.start();return container;}};} } 您可能会认为BeanPostProcessor是一个过大的功能但是稍后它将变得非常有用。 我们在这里所做的是如果遇到从应用程序上下文中被请求的EmbeddedServletContainerFactory 我们将返回一个装饰器该装饰器急切地启动Tomcat。 这给我们带来了相当不稳定的设置即Tomcat接受到尚未初始化的上下文的连接。 因此让我们放置一个servlet过滤器来拦截所有请求直到上下文完成为止。 启动期间拦截请求 我仅通过将FilterRegistrationBean添加到Spring上下文开始希望它会拦截传入的请求直到上下文启动为止。 这是徒劳的我不得不等待很长时间才能注册过滤器并准备好因此从用户的角度来看应用程序已挂起。 后来我什至尝试使用Servlet API javax.servlet.ServletContext.addFilter() 在Tomcat中直接注册过滤器但显然必须预先引导整个DispatcherServlet 。 记住我想要的只是来自即将初始化的应用程序的快速反馈。 因此我最终得到了Tomcat的专有API org.apache.catalina.Valve 。 Valve与Servlet过滤器类似但它是Tomcat体系结构的一部分。 Tomcat自己捆绑了多个阀门以处理各种容器功能例如SSL会话群集和X-Forwarded-For处理。 Logback Access也使用此API因此我不会感到内。 阀门看起来像这样 package com.nurkiewicz.progress;import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; import org.apache.catalina.valves.ValveBase; import org.apache.tomcat.util.http.fileupload.IOUtils;import javax.servlet.ServletException; import java.io.IOException; import java.io.InputStream;public class ProgressValve extends ValveBase {Overridepublic void invoke(Request request, Response response) throws IOException, ServletException {try (InputStream loadingHtml getClass().getResourceAsStream(loading.html)) {IOUtils.copy(loadingHtml, response.getOutputStream());}} } 阀门通常委托给链中的下一个阀门但是这次我们只为每个单个请求返回static loading.html页面。 注册这样的阀门非常简单Spring Boot为此提供了一个API if (factory instanceof TomcatEmbeddedServletContainerFactory) {((TomcatEmbeddedServletContainerFactory) factory).addContextValves(new ProgressValve()); } 定制阀门原来是个好主意它从Tomcat立即开始并且非常易于使用。 但是您可能已经注意到即使在应用程序启动后我们也不会放弃提供loading.html 。 那很糟。 Spring上下文可以通过多种方式发出初始化信号例如使用ApplicationListenerContextRefreshedEvent Component class Listener implements ApplicationListenerContextRefreshedEvent {private static final CompletableFutureContextRefreshedEvent promise new CompletableFuture();public static CompletableFutureContextRefreshedEvent initialization() {return promise;}public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {return bean;}Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {promise.complete(event);}} 我知道您的想法是“ static ”吗 但是在Valve内部我根本不想接触Spring上下文因为如果我在错误的时间点从随机线程请​​求某个bean它可能会引入阻塞甚至死锁。 完成promise Valve注销自身 public class ProgressValve extends ValveBase {public ProgressValve() {Listener.initialization().thenRun(this::removeMyself);}private void removeMyself() {getContainer().getPipeline().removeValve(this);}//...} 这是一个令人惊讶的干净解决方案当不再需要Valve我们无需从处理管道中删除它而不必为每个请求支付费用。 我不会演示它如何工作以及为什么起作用让我们直接转到目标解决方案。 监控进度 监视Spring应用程序上下文启动的进度非常简单。 另外与EJB或JSF等API和规范驱动的框架相比Spring框架的“可破解性”也让我感到惊讶。 在Spring中我可以简单地实现BeanPostProcessor 以通知每个正在创建和初始化的bean 完整的源代码 package com.nurkiewicz.progress;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import rx.Observable; import rx.subjects.ReplaySubject; import rx.subjects.Subject;class ProgressBeanPostProcessor implements BeanPostProcessor, ApplicationListenerContextRefreshedEvent {private static final SubjectString, String beans ReplaySubject.create();public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {return bean;}Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {beans.onNext(beanName);return bean;}Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {beans.onCompleted();}static ObservableString observe() {return beans;} } 每次初始化新bean时我都会将其名称发布到RxJava的可观察对象中。 整个应用程序初始化后我完成了Observable 。 任何人都可以使用此Observable 例如我们的自定义ProgressValve 完整的源代码 public class ProgressValve extends ValveBase {public ProgressValve() {super(true);ProgressBeanPostProcessor.observe().subscribe(beanName - log.trace(Bean found: {}, beanName),t - log.error(Failed, t),this::removeMyself);}Overridepublic void invoke(Request request, Response response) throws IOException, ServletException {switch (request.getRequestURI()) {case /init.stream:final AsyncContext asyncContext request.startAsync();streamProgress(asyncContext);break;case /health:case /info:response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);break;default:sendHtml(response, loading.html);}}//...} ProgressValve现在变得更加复杂我们还没有完成。 它可以处理多个不同的请求例如我有意在/health和/info Actuator端点上返回503以便该应用程序看起来像在启动期间处于关闭状态。 除了所有其他请求init.stream表明熟悉loading.html 。 /init.stream是特殊的。 这是服务器发送的事件端点它将在每次初始化新bean时推送消息很抱歉上面没有代码 private void streamProgress(AsyncContext asyncContext) throws IOException {final ServletResponse resp asyncContext.getResponse();resp.setContentType(text/event-stream);resp.setCharacterEncoding(UTF-8);resp.flushBuffer();final Subscription subscription ProgressBeanPostProcessor.observe().map(beanName - data: beanName).subscribeOn(Schedulers.io()).subscribe(event - stream(event, asyncContext.getResponse()),e - log.error(Error in observe(), e),() - complete(asyncContext));unsubscribeOnDisconnect(asyncContext, subscription); }private void complete(AsyncContext asyncContext) {stream(event: complete\ndata:, asyncContext.getResponse());asyncContext.complete(); }private void unsubscribeOnDisconnect(AsyncContext asyncContext, final Subscription subscription) {asyncContext.addListener(new AsyncListener() {Overridepublic void onComplete(AsyncEvent event) throws IOException {subscription.unsubscribe();}Overridepublic void onTimeout(AsyncEvent event) throws IOException {subscription.unsubscribe();}Overridepublic void onError(AsyncEvent event) throws IOException {subscription.unsubscribe();}Overridepublic void onStartAsync(AsyncEvent event) throws IOException {}}); }private void stream(String event, ServletResponse response) {try {final PrintWriter writer response.getWriter();writer.println(event);writer.println();writer.flush();} catch (IOException e) {log.warn(Failed to stream, e);} } 这意味着我们可以使用简单的HTTP接口来跟踪Spring应用程序上下文启动的进度 $ curl -v localhost:8090/init.streamGET /init.stream HTTP/1.1User-Agent: curl/7.35.0Host: localhost:8090Accept: */* HTTP/1.1 200 OKContent-Type: text/event-stream;charsetUTF-8Transfer-Encoding: chunkeddata: org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration$EmbeddedTomcatdata: org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration$TomcatWebSocketConfigurationdata: websocketContainerCustomizerdata: org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfigurationdata: toStringFriendlyJsonNodeToStringConverterdata: org.hibernate.validator.internal.constraintvalidators.bv.NotNullValidatordata: serverPropertiesdata: org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration...data: beanNameViewResolverdata: basicErrorControllerdata: org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration$JpaWebConfiguration$JpaWebMvcConfiguration 该端点将实时初始化请参阅 使用RxJava和SseEmitter的服务器发送的事件 每个初始化的单个bean名称。 有了如此出色的工具我们将建立更强大的 React性的 在这里我说过 loading.html页面。 花式进度前端 首先我们需要确定哪些Spring bean代表了系统中的哪些子系统 高级组件甚至可能是有限的上下文 。 我使用data-bean自定义属性在HTML内部对此进行了编码 h2 data-beanwebsocketContainerCustomizer classwaitingWeb socket support /h2h2 data-beanmessageConverters classwaitingSpring MVC /h2h2 data-beanmetricFilter classwaitingMetrics /h2h2 data-beanendpointMBeanExporter classwaitingActuator /h2h2 data-beanmongoTemplate classwaitingMongoDB /h2h2 data-beandataSource classwaitingDatabase /h2h2 data-beanentityManagerFactory classwaitingHibernate /h2 CSS classwaiting表示给定的模块尚未初始化即给定的bean尚未出现在SSE流中。 最初所有组件都处于waiting状态。 然后我订阅init.stream并更改CSS类以反映模块状态更改 var source new EventSource(init.stream); source.addEventListener(message, function (e) {var h2 document.querySelector(h2[data-bean e.data ]);if(h2) {h2.className done;} }); 简单吧 显然无需使用jQuery就可以在纯JavaScript中编写前端。 加载所有bean后 Observable在服务器端event: complete SSE发出event: complete 让我们处理一下 source.addEventListener(complete, function (e) {window.location.reload(); }); 因为前端是在应用程序上下文启动时通知的所以我们可以简单地重新加载当前页面。 那时我们的ProgressValve已经注销因此重新加载将打开真实的应用程序而不是loading.html占位符。 我们的工作完成了。 另外我还计算了启动的bean数量并知道总共有多少bean我用JavaScript对其进行了硬编码请原谅我可以用百分比来计算启动进度。 图片值一千个字让此截屏视频向您展示我们取得的成果 后续模块启动良好我们不再关注浏览器错误。 以百分比衡量的进度使整个启动进度感觉非常顺利。 最后但并非最不重要的一点是当应用程序启动时我们将自动重定向。 希望您喜欢这个概念证明整个工作示例应用程序都可以在GitHub上找到。 翻译自: https://www.javacodegeeks.com/2015/09/displaying-progress-of-spring-application-startup-in-web-browser.htmlspring 启动进度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/86670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

餐饮加盟网站怎么做wordpress配置多站点

文章目录 1. 云计算1.1 云计算概念1.2 云计算的服务模式和类型1.3 云计算的数据中心与应用 2. 物联网2.1 物联网的概念和关键技术2.2 物联网的应用和产业2.3 大数据与云计算、物联网的关系 1. 云计算 1.1 云计算概念 1. 首先从商业角度给云计算下一个定义:通过网络…

购物网站开发文献综述长春网站营销

python if not判断是否为None的情况if not xif x is Noneif not x is Noneif x is not None是最好的写法,清晰,不会出现错误,以后坚持使用这种写法。使用if not x这种写法的前提是:必须清楚x等于None, False, 空字符串""…

自媒体横行还有做网站淘宝网站怎么做的好坏

PHP解压tar.gz格式文件的方法,本文实例讲述了PHP解压tar.gz格式文件的方法。分享给大家供大家参考,具体如下:1、运用php自带压缩与归档扩展(phar)$phar new PharData(song.tar.gz);//路径 要解压的文件 是否覆盖$phar->extractTo(c:/tmp,…

qq是腾讯还是阿里湖北短视频seo营销

今天开始学mysql数据库,为什么要学这个呢,因为数据库可结构化存储大量的数据信息,方便用户进行有效的检索和访问。数据库可有效地保持数据信息的一致性、完整性、降低数据冗余。数据库可满足应用的共享和安全方面的要求,把数据放在…

怎样如何做网站赚钱网站营销策略

9月10日下午,华为在东莞松山湖举办了2020开发者大会,鸿蒙OS 2.0正式发布。会后,华为软件部总裁王成录博士、华为软件部副总裁杨海松等接受了专访。谈及鸿蒙OS 2.0的规划,杨海松表示,大家非常期待的手机的Beta版本会在今…

liunx做网站跳转服务器企业网站代备案

文章目录 概要Labelme 是什么?Labelme 能干啥? Ubuntu20.04安装Labelme1.Anaconda的安装2.Labelme的安装3.Labelme的使用 概要 图像检测需要自己的数据集,为此需要对一些数据进行数据标注,这里提供了一种图像的常用标注工具——la…

永久网站装修公司网站asp源码

在Python中,你可以使用requests库来发送HTTP请求,以及BeautifulSoup或Scrapy库来解析网页内容。你也可以使用selenium库,它是一个自动化测试工具,用于模拟用户在浏览器中的操作。 下面是一个简单的例子,说明如何使用r…

涿州李战彪搜索引擎优化入门

env: centos 6.5 x64 hyper-v虚拟机 这个方法可以在当前运行的系统中扩展root磁盘 详细步骤 之前想创建的一个虚拟机的磁盘空间不够用了,所以想扩容一下磁盘。 正好使用的时候是lvm磁盘,可以支持扩容。 格式化一个新的分区或者磁盘 Command…

手机一元云购网站建设网站开发工具评价

一. 场景下单后库存校验或者秒杀场景下,有很多利用“锁”的方案来解决问题。但是加锁其实是一件性价比很低的事,所以我们采用用redislua的方式来实现这个功能。二. 思路阶段一:在库存加减逻辑中分为2个步骤:STEP1.读取库存&#x…

免费二维码制作网站注册公司核名

文章目录 前言什么是服务质量(QoS)?如何配置服务质量?CPU资源配置示例 内存资源配置示例 服务质量等级的判断服务质量的最佳实践结论 前言 Kubernetes(简称K8s)是一种开源的容器编排平台,用于简…

wordpress多用户信息发布岳阳关键词优化

problem 洛谷链接 solution 一个 AiA_iAi​ 只会影响一个 BiB_iBi​,BiB_iBi​ 之间的决定因素 AAA 是不会有交的。 所以如果相邻两个对同一个 BiB_iBi​ 影响的 A2i,A2i−1A_{2i},A_{2i-1}A2i​,A2i−1​ 都是确定的,那么 BiB_iBi​ 也就确定了。 …

可视化建站网站源码常德做网站专业公司

D题(文末获取完整版的) 题目三:新控制方法是否会让各利益相关者满意或优于当年实际记录的 水位? 解题思路 问题 3 要求我们理解控制算法对两座控制大坝流出量的敏感性,并利用 2017 年 的数据来验证新控制措施是否能为各方利益相关…

汶上县住房和城乡规划建设局官方网站如何对网站的图片做cdn

第 1 步:裁剪视频 修改序列设置以适应裁剪之后的图像区域;序列中的编辑模式不能使用默认的,这里使用的是“ProRes RAW” 第 2 步:设置背景色 需要设置“颜色遮罩”的大小和颜色,颜色遮罩放在下面。 第 3 步&#xff1…

宿迁住房和城乡建设部网站专业的丹阳网站建设

在阿里工作了8年,工作压力大,节奏快,但是从技术上确实得到了成长,尤其是当你维护与大促相关的系统的时候,熬到P7也费了不少心思,小编也是个爱学习的人,把这几年的工作经验整理成了一份完整的笔记…

宝安专业网站设计多少钱app开发设计方案怎么写

1、基础 运行 Windows 的计算机中的处理器有两个不同模式:“用户模式”和“内核模式”。根据处理器上运行的代码的类型,处理器在两个模式之间切换。应用程序在用户模式下运行,核心操作系统组件在内核模式下运行。多个…

融安有那几个网站做的比较好的深圳建网站公司哪家好

import json# 加载包含ID对应字符串的JSON文件 with open("base_vocab.json", "r", encoding=utf-8) as file:id_to_str = json.load(file)# 将ID对应字符串的JSON转换为字符串对应ID的JSON # 注意:这里我们假设id_to_str字典的键都是字符串类型 str_to_i…

创建网站时间代码wordpress正版插件吗

gnome-builder创建的程序,在工程树中有三个重要程序:main主程序、application应用程序和window主窗口程序。main整个程序的起始,它会操作application生产应用环境,application会操作window生成主窗口,于是就有了 appli…

公司宣传一般建的是网页还是网站wordpress博客500

数字图像处理学习笔记(五) 表示与描述表示链码最小周长多边形的多边形近似(MPP)标记边界片段骨骼(表示平面区域结构形状) SIFT原理(尺度不变特征变换匹配算法:Scale-invariant feature transform)SIFT算法分…

哪里有专业网站建设公司html5手机网站开发区别

MPP 架构: MPP 架构的产品: Impala ClickHouse Druid Doris 很多 OLAP 引擎都采用了 MPP 架构 批处理系统 - 使用场景分钟级、小时级以上的任务,目前很多大型互联网公司都大规模运行这样的系统,稳定可靠,低成本。…