范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

异步Servlet都不懂,谈何WebFlux?

  我们日常使用的 SpringMVC,基本上都不是异步 Servlet,而学习 WebFlux,异步 Servlet 是基础,因此还是花点时间来和大家聊一聊什么是异步 Servlet,这有助于大家理解我们为什么需要 WebFlux。  1.什么是异步 Servlet
  先来说说什么是非异步 Servlet。
  在 Servlet3.0 之前,Servlet 采用 Thread-Per-Request 的方式处理 Http 请求,即每一次请求都是由某一个线程从头到尾负责处理。
  如果一个请求需要进行 IO 操作,比如访问数据库、调用第三方服务接口等,那么其所对应的线程将同步地等待 IO 操作完成, 而 IO 操作是非常慢的,所以此时的线程并不能及时地释放回线程池以供后续使用,如果并发量很大的话,那肯定会造性能问题。
  传统的 MVC 框架如 SpringMVC 也无法摆脱 Servlet 的桎梏,原因很简单,他们都是基于 Servlet 来实现的。如 SpringMVC 中大家所熟知的 DispatcherServlet(如果大家对于 SpringMVC 的原理不太理解,可以查看松哥之前的系列文章SpringMVC源码解读系列,20 篇干货完美收官!)。
  为了解决这一问题,Servlet3.0 中引入了异步 Servlet,然后在 Servlet3.1 中又引入了非阻塞 IO 来进一步增强异步处理的性能。
  在正式开整 WebFlux 之前,我们先来了解下异步 Servlet 的一些基本玩法。  2.版本关系
  我们要先看看 Servlet 和 Tomcat 之间的对应关系,毕竟异步 Servlet 这种事,用错了 Tomcat 版本可能就不支持了。
  下图来自 Tomcat 官网(http://tomcat.apache.org/whichversion.html):
  从上图我们可以看出,Servlet3.0 对应的 Tomcat 版本是 7.0.x,Servlet3.1 对应的 Tomcat 版本是 8.0.x。
  换句话说,如果我们要使用异步 Servlet,Tomcat 至少要 7.0 以上的版本;如果你还想体验一把非阻塞 IO,那么 Tomcat 至少要 8.0 以上。
  接下来的案例小伙伴们记得选好自己本地的 Tomcat 版本。  3.基本玩法
  先来看一个大家熟悉的同步 Servlet:  @WebServlet(urlPatterns = "/sync") public class SyncServlet extends HttpServlet {     @Override     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {         doGet(request, response);     }      @Override     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {         long start = System.currentTimeMillis();         printLog(request, response);         System.out.println("总耗时:" + (System.currentTimeMillis() - start));     }      private void printLog(HttpServletRequest request, HttpServletResponse response) throws IOException {         try {             Thread.sleep(3000);         } catch (InterruptedException e) {             e.printStackTrace();         }         response.getWriter().write("ok");     } }
  这个 Servlet 大家再熟悉不过了。
  前端请求到达后,我们调用 printLog 方法做一些处理,同时把 doGet 方法执行耗时打印出来。
  在 printLog 中,我们先休息 3s,然后给前端返回一个字符串给前端。
  前端发送请求,最终 doGet 方法中耗时 3001 毫秒。
  这是我们大家熟知的同步 Servlet。在整个请求处理过程中,请求会一直占用 Servlet 线程,直到一个请求处理完毕这个线程才会被释放。
  接下来我们对其稍微进行改造,使之变为一个异步 Servlet。
  有人可能会说,异步有何难?直接把 printLog 方法扔到子线程里边去执行不就行了?但是这样会有另外一个问题,子线程里边没有办法通过 HttpServletResponse 直接返回数据,所以我们一定需要 Servlet 的异步支持,有了异步支持,才可以在子线程中返回数据。
  我们来看改造后的代码:  @WebServlet(urlPatterns = "/async",asyncSupported = true) public class AsyncServlet extends HttpServlet {     @Override     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {         doGet(request, response);     }      @Override     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {         long start = System.currentTimeMillis();         AsyncContext asyncContext = request.startAsync();         CompletableFuture.runAsync(() -> printLog(asyncContext,asyncContext.getRequest(),asyncContext.getResponse()));         System.out.println("总耗时:" + (System.currentTimeMillis() - start));     }      private void printLog(AsyncContext asyncContext, ServletRequest request, ServletResponse response){         try {             Thread.sleep(3000);             response.getWriter().write("ok");             asyncContext.complete();         } catch (InterruptedException | IOException e) {             e.printStackTrace();         }     } }
  这里的改造主要有如下几方面:  @WebServlet 注解上添加 asyncSupported 属性,开启异步支持。  调用 request.startAsync(); 方法开启异步上下文。  通过 JDK8 中的 CompletableFuture.runAsync 方法来启动一个子线程(当然也可以自己 new 一个子线程)。  调用 printLog 方法时的 request 和 response 重新构造,直接从 asyncContext 中获取,注意,这点是【关键】。  在 printLog 方法中,方法执行完成后,调用 asyncContext.complete() 方法通知异步上下文请求处理完毕。
  经过上面的改造之后,现在的控制台打印出来的总耗时几乎可以忽略不计了。
  也就是说, 有了异步 Servlet 之后,后台 Servlet 的线程会被及时释放,释放之后又可以去接收新的请求,进而提高应用的并发能力。
  第一次接触异步 Servlet 的小伙伴可能会有一个误解,以为用了异步 Servlet 后,前端的响应就会加快。这个怎么说呢?后台的并发能力提高了,前端的响应速度自然会提高,但是我们一两个简单的请求是很难看出这种提高的。  4.小结
  好啦,今天就和大家分享一下异步 Servlet,作为 WebFlux 的一个前奏。至此,我们的 WebFlux 前奏已经更新了五篇了,即将进入 WebFlux 的殿堂。
  原文链接:https://mp.weixin.qq.com/s/zgrPg9DM9OkPMs8XI-PiMA

方舟生存进化老外趁人之危偷袭中国主播,结果被陷阱坑杀方舟生存进化是Steam上一款十分火爆的生存沙盒游戏,属于那种人气质量口碑兼备的作品。它采用了拟真的天气系统和昼夜系统,不同的天气和时间对玩家的健康值和视野有一定的影响。而在玩法上盘点10款Steam烧显卡游戏,是海盗还是商人由玩家自己决定烧显卡是当代的一个很火的名词,只有在游戏的画面效果达到一定程度之后才能展现出烧显卡的游戏画质。下面我就来给各位推荐10款烧显卡游戏,它们的画面质量都非常的出色,能够让玩家的视觉享受黑暗与光明手游拿着木棍连豪猪都打不过?造出法杖能轻松狩猎黑暗与光明手游作为一款少见的魔幻色彩的沙盒游戏,玩家在游戏中能体验到各种游戏模式。不论是传统建造玩法还是生存模式,亦或是通过冒险探索都能找到游戏的快乐。在这片魔法大陆里玩家需要靠自Steam海盗游戏ATLAS熊比帆船还重要,是玩家抄家的利器在海战中,最重要的无疑就是船员们的船只,一旦帆船被打破了,再强大的炮也会沉入海底,这也是为何各个国家都在拼尽全力的去发展船只的重要原因。可是这个铁则在Steam海盗战争游戏ATLA克拉肯风卷残云,Steam海盗游戏ATLAS玩家出海就遇上噩梦在诸多以海盗为题材的影视作品中,经常会出现北海巨妖这么一种神秘的生物,它有着庞大的身躯和几十只灵活的大触手,外表酷似章鱼,它就是克拉肯。这种生物在神话传说中早就已经诞生,现实生活中Steam海盗游戏ATLAS坏血病有多恐怖?曾夺走过1000个人的生命在历史上,坏血病是一种极为恐怖的疾病,在人类还不知道它的起因时,它曾经夺走过无数船员的生命,当时麦哲伦进行环球之旅时带了3000个船员,最后活下来的不到50个人,包括麦哲伦本人都在国庆期间玩什么游戏?这10款耐玩的Steam佳作让小长假不再无聊国庆小长假有点久呀,小伙伴们在家里都做些什么呢要是感觉无聊,或是感觉没有什么游戏玩。可以来Steam上找一些好玩的游戏来消遣哦。下面为大家推荐10款Steam佳作。一起开火车!一起10款爆内存沙盒手游推荐,黑暗与光明手游玩家被哥布林戏耍沙盒游戏的最大特点就是超高的自由度和随心所欲的玩法,很多玩家都沉浸在沙盒游戏的超高自由度中,下面为大家推荐10款爆内存的沙盒手游。原神原神这款开放世界游戏可以说十分好玩,游戏中的各Steam海盗游戏ATLAS龙卷风超可怕,再大的船都能掀翻ATLAS是Steam上的一款海盗战争游戏,在这款游戏中,玩家们可以自己建造出想要的帆船然后去ATLAS的世界里冒险与航行。可是这场旅行并没有玩家们想象中的那么的简单,事实上玩家在纵横天空的霸主也插翅难逃,方舟生存进化主播教学驯龙攻略在全球最大游戏平台Steam上,有很多能将不同元素给融合起来的游戏,它们被玩家们称之为缝合怪。由于这类游戏融合的都是经典游戏的亮点,因此它们都非常的好玩。而方舟生存进化绝对是其中的10款爆内存沙盒手游推荐,黑暗与光明手游玩家打造豪华别墅沙盒手游是由沙盘游戏演变而来的一种游戏类型,通常一个游戏会由一个或者多个地图构成,包含了角色扮演动作。设计创造等多种要素。可以说,沙盒手游为许多玩家提供了快乐的源泉。休闲趣味惊险刺
鱿鱼游戏黑衣人骗了警察,哪怕是被带走,弟弟也活不了多久黑衣人是鱿鱼游戏中的领导者,老头是主办者,而他则帮助老头解决一切游戏事宜,然而他怎么也没想到,弟弟会随着线索一路追查过来,最要命的是,弟弟已经掌握了大量的证据,如果让他跑掉,神秘组您好!母亲大人被一台缝纫机毁掉的人生,丁碧云不值得同情由董洁等人联合主演的一部家庭剧,您好!母亲大人已经开播了,虽说只看了两集,但还是被剧中的妈妈,也就是丁碧云给糊涂到了。她年轻的时候长相清秀,又有着一身裁缝的手艺,按理说最不缺的就是鱿鱼游戏赢家能是多人吗?如果17号参赛者不死,就会有两人获胜看完鱿鱼游戏后,深深被主办方的把控能力折服。每一场游戏要淘汰多少人,主办方都算得非常精准,因为游戏的最后只能有一个赢家,然而红衣人在公布比赛规则的时候,却没有明确说明赢家到底是不是功勋孙家栋篇李东海的胳膊,小孟的死,开场两集就让人泪目功勋孙家栋篇已经开播了,本来这个片段中最让人期待的是佟大为与孙俪时隔多年的合作,谁曾想,还没被孙家栋的爱情感动到,反而被战士们对革命的付出破防了,我们如今的幸福生活,可是那些革命伟八角亭迷雾朱家找错了人,朱胜辉的死,有个人的嫌疑比玄梁更大八角亭迷雾的剧情非常紧凑,不过短短两集,就已经出现两名死者了,而这两名死者都跟念玫有很重要的关系,19年前死的是自己的姑姑,如今连骚扰念玫的朱胜辉都死了,念玫就像一颗紧紧缠绕的藤蔓生存特训决战绿地战场!60V60,狗年我们选择不苟!大家好!你们的朋友天蓝如约而至今天给大家带来的是国民枪战竞技手游穿越火线手游版新推出的生存特训阵营交战模式介绍。玩腻了单排和小队的小规模战斗,渴望去打团?新模式让你如愿以偿,CF手从会计门看当今直播行业网民还是需要理性思考自从2017年年底,中国的直播界就一直很不太平。前日又发生一起会计侵吞公司公款打赏主播的会计门新闻,更是将这一行业推上了风口浪尖。据新闻了解到,这名会计前后一共挪用了890万的资金绝地求生吃鸡单排战术手册如何科学的守楼关注天蓝电竞,浏览更多原创干货哈喽大家好,欢迎观看由天蓝今天带给大家的绝地求生吃鸡单排手册如何科学的守楼。在之前的文章中,天蓝已经很系统的给大家讲解了在绝地求生游戏中攻楼需要避免的深度剖析会计门面对追款,谁来带头承担应有的责任最近几日,会计门可算是直播界最具热点和关注力的新闻。无数的猜测或真或假的消息粉丝之间的攻击层出不穷。几位当事人更是被推到了风口浪尖,其中首当其冲的便是主播冯提莫了。那么,会计门到底纵观会计门公款打赏,错的不是冯提莫,而是他直播界最近一段时间最火的事件莫过于会计门了,事件的主人公镇江某地产公司会计29岁的王某,为打赏各平台的多名主播前后挪用公款高达900多万元。后来事情败露,王某畏罪自杀未遂投案自首。善莫大焉,主播离开针对失误道歉,重开抽奖善莫大焉,主播离开针对失误道歉,重开抽奖午休睡醒上班之前逛了逛论坛,被一则推送的标题晃了下眼睛抽奖改条件,知名主播离开leave活动遭质疑作为暴雪的忠实粉丝,小编从守望先锋这款游戏