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

异步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

技术贴,热血传奇中法师被忽视的神技,学会可横扫玛法大陆在热血传奇中,法师作为升级快,技能高爆发且范围广,团战无敌等特点,一直深受传奇玩家的喜爱,特别是手法好的技术流玩家,法师就是他们的首选职业。当年麻烦的畅销传奇类小说法师传奇,可谓把复古传奇小故事传说中的法神项链有的时候好运来了真的是挡都挡不住,我记得以前在老区的时候,我一天之内连续遇到了三次好事。第一个是我去升无极,只是用了普通的首饰和黑铁矿,居然成功之后跳点了,直接从道六就升到了道八。热血传奇当年有人追着魂十五砍?战神殿老成员透露,被打换服大家好,我们专心为传奇玩家分享传奇故事,感谢大家在百忙之中还愿意点开我们的文章,实在是感激不尽。今天和大家聊的是热血传奇当年有人追着魂十五砍?战神殿老成员透露,你应该看看。就在零一复古传奇再现,经典手游复古传奇这款游戏在如今开来不过是一个过气网游罢了,现在的网游无论是画质还是玩法都要比热血传奇好太多了,尽管如此这款游戏却仍旧活跃在玩家的视线当中。现如今的热血传奇大部分都是页游,而热血传奇大浪淘沙,新一代金牌指挥和家族崛起,有人已身价千万热血传奇,曾经火爆全国的国民网游,是属于70后到90后那代人共同的青春回忆。传奇最大的魅力就在于游戏的激情,把男人的血性与兄弟情谊展现的淋漓尽致。有争斗的地方就有江湖,有江湖的地方热血传奇那些从二区光芒开始的传奇经历,骨灰玩家都有过吗关于热血传奇的回忆,你还记得哪些?今天想起热血传奇,带着又爱又恨又难以割舍的情怀,因为毕竟这是我玩过的第一款游戏。2002年,我还只是一个高一的学生,家里一台P41。3128内存4热血传奇1。76复古版本不会玩?来看道士升级打宝心得!(一)大家好,这一次给大家带来传奇1。76版本道士的升级打宝心得,写的不好各位大神勿喷。在热血传奇出了复古区之后一些骨灰级玩家又一次的跳了出来,利用游戏的自身的游戏验,来做到快速升级。让复古传奇手游道士怎么吊打法师法师作为一个手长的输出职业一直很让道士头疼,就连带着很强的宝宝也很难很好地克制法师,现在教大家一个很大众的道士打法师的套路,希望能给广大道士玩家带来帮助。关注微信公众号复古传奇三端热血传奇关于游戏存亡的事件,你还记得多少?游戏介绍经典传奇回忆,版本回归,崭新征程,与兄弟们一起,重登珐玛大陆!加入复古传奇重温只属于你的记忆,和兄弟一起再战沙巴克!复古传奇的故事始于东方神秘的玛法大陆。作为一款大型MMO韩漫抄袭有多野?一拳分镜照搬,千与千寻也不放过韩漫以肉眼可见的速度迅速扩张,但也不可避免暴露一个问题那就是抄袭现象越来越严重。我们比较关注国漫和日漫领域,却极少关注韩漫领域。回头看韩漫,抄袭现象比比皆是,甚至抄到了咒术回战千与网友自制蛞蝓少女实物,采用正常人类比例,又精致又恐怖蛞蝓少女是恐怖漫画家伊藤润二的经典作品之一,它创作于富江系列之后,也是一部非常受欢迎的作品。伊藤润二的作品太过于经典,让他在全世界范围内都有了大量读者。一位泰国网友动手制作出了蛞蝓
三国杀总共五个诸葛,最强与最弱或许相差了不止三倍战力众所周知三国杀的技能是根据三国时期的人物演变而来,而三国时期又最盛行以官僚世族为主的制度,所以往往都是有钱有家世的进入官场,官场之中经常会碰见自己同族同属的,后又逐渐转为氏族家族之三国杀界朱然迎风突破,摸牌强伤样样不落,和大乔为神配合三国杀移动版哈喽!各位好呀,我是淮竹,持续为你带来三国杀移动版最新资讯和趣味玩法喜欢的话希望你能陪伴下去哦最近三国杀移动版又迎来了一波热潮,因为测试服又出了一批测试武将,其中就有司蜀国并非仅卧龙一人享特殊待遇,还有一人在刘备前常跷二郎腿诸葛亮对于蜀国的意义各位应该都很清楚,蜀国大丞相,地位仅次于主公刘备,刘备的王牌军师,不管去哪儿都会请教诸葛亮,对他言听计从。从开始的隆中对三顾茅庐都可以看出刘备对卧龙的尊敬和渴望又一位让神将自闭的武将来了,大嘴也难逃毒手!翻手之间镇压神曹移动版最近的冬至活动武将可谓是上了不少,董承邓芝杨仪这些精品外,还上了界钟会,而且还是史诗的定位。虽然这些武将有史诗有精品,但淮竹从不认为武将的品质完全代表武将的强度,例如要看的这三国杀半夜不睡型武将,强度天差地别,有些真配不上我的黑眼圈限时秒杀什么武将最为强力?限时秒杀作为三国杀一大良心(圈钱)活动,以相对较低的价位售卖武将及皮肤。一直以来都广受玩家关注和欢迎,限时秒杀中的武将各自强度如何,也是玩家们无比关心的问三国杀限时秒杀才子佳人篇,200买4个武将到底值不值?小编的限时秒杀专题,目前还剩下才子佳人和星徐晃没有解读,这一篇小编就来清一下历史欠账,把才子佳人4名武将和星徐晃的介绍为大家奉上,星徐晃将会在下一篇文章中加以展现,希望各位理解,毕星徐晃限时秒杀又一个强度直逼史诗的优质武将限时秒杀在新年的第一天更新了一名新武将,星徐晃。如今星徐晃已经上线许久,也是广受广大杀友好评,玩过的都说好。小编也来给大家解读一下这个武将,由于星徐晃的强力程度已经是让人众所周知了三国杀此几位虎将,虽总被遗忘,却可让队友兵乐无处遁形兵粮寸断乐不思蜀绝对是所有三国杀玩家的两大公敌了。多少次一手好牌头上却有个乐,含泪丢下所有爆发牌然后愤怒点下托管多少次等到了一个出牌的机会敌人只剩最后一击,却身中断粮只能默默的0牌三国杀这些魔将大战,谁能撑到最后?马良马神的威名可不是浪得虚名,堪称节俭互助的好同志。手牌用完呀,队友还能接着用也就意味着同一张牌要准备抵挡两次,这个将的强度已经接近史诗了。麴义距离范围内的霸王,爆发力来身边的人最三国杀排位经典配合们,传说到底还有多远?排位赛是一个配合大于强度的地方,对选将强度的要求并不是很大。最主要的是配合和牌运和打法,所以今天小编给大家带来的是相关配合阵。希望能够帮到大家排位上分吖。我们先观察全排位将池,分为晋国之祖,天下归一,曾经稳居最强神的司马懿究竟如何跌落神坛?神司马懿是陪伴了三国杀这个游戏开局的一名神武将,上线自风林火山时代,堪称是最初的时代骄傲,手杀因持续担忧游戏平衡原因,直至18年才令其上线手杀,且上线之初便广受追捧。但是时过境迁,