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

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

FPX正式官宣Clid加入,lwx再迎来强力队友,新赛季开启复仇之旅大家好,我是燃烧。距离LPL春季赛揭幕还有5天,各大战队已经摩拳擦掌准备投入新赛季的征战,然而就在刚刚,FPX正式官宣打野Clid加入战队,补足了战队最后一块拼图,lwx再次迎来强斗罗大陆邪恶唐三上线,马红俊陷入迷雾阵,千仞雪第六考失利七圣柱挑战赛还在继续,奥斯卡戴沐白已经完成第五考,唐三则是需要挑战七位圣柱斗罗。唐三现在的实力和普通封号斗罗差不多了,精神力也是相当强大,同时还有很多外挂傍身,而且考核过程中,还可手游每日榜单(2022年1月6日)每日更新游戏榜单和新鲜资讯,关注我不迷路。关注我的都棒棒哒!今天是2022年1月6日,首先来看看今天的畅销榜单变化今天具体的榜单如下网易大话西游排名第10。这是一款经典2D回合制手2021年值得入手的游戏推荐刚过2021年,现在小编整理了一些资料把2021年出来的游戏进行汇总,看看有哪些游戏值得入手。1。最后生还者2(RPG角色扮演)最后生还者第二部(TheLastofUs第二部)是著神奇女侠游戏脸模公布美国女演员MadisonHauck近日,神奇女侠游戏官方推特公布了游戏中戴安娜公主的脸模美国女演员MadisonHauck,来自加利福尼亚,身高高达172cm。除了担任神奇女侠游戏戴安娜公主的脸模,MadisonH我的世界逼死强逼症,这些图看了很难受,苦力怕你当回人在品尝本文前,先确认各位并没有强逼症,并且再一次确认一下题目是否没有看错,不然分分钟你会因为受不了折磨而抓狂我的世界有三宝,僵尸骷髅苦力怕,虽然它们同属为怪兽阵容,但其在生物AI上游戏真的怕了?原神王者都在卖力宣传文化输出,到底想传达什么随着时代的发展,游戏成为最主流的娱乐方式,于此同时,也肩负起了越来越多传播文化的重任。只是,虽然我国已经成为世界上最大的游戏市场,但是在文化输出这一层面,却并不领先。正如很多人所意偶像经理人披着偶像外衣的资本游戏本文作者星游社白藏友情提示,本文含少量剧透前言偶像经理人是由GlitchPitch开发的一款偶像题材的模拟经营游戏。在游戏中玩家需要扮演的是一个偶像事务所的制作人,培养自己的偶像团S26赛季史诗级调整,3分钟带你解读新版本,5大巨变抢先知小伙伴们期待已久的S26赛季终于要开始了,定在了1月6日进行版本大更新。过去的S25赛季应该也是历时最长的一个赛季了,持续了几个月的时间,大家的战令系统应该也都接近200级了吧。而王者荣耀S26赛季开启新增两个段位更有专属称号CNMO新闻众所周知,王者荣耀作为国内最受欢迎的手游之一,每次赛季大更新都会引起很多人的期待。1月6日000730,王者荣耀S26赛季玉城之子正式开启更新,兵线防御塔,暴君和主宰等新赛季碎片商店首次更新,暃伴生碧珀绯影加入兑换王者荣耀新赛季马上就要开启了,相信大家对于S26赛季还是比较期待的,碎片商店将会在新赛季开启的第一天进行更新,也算是S26赛季首次更新了,这次更新建议大家准备好116皮肤碎片,这样
沉默传奇沉默复古单职业打金传奇BOSS大比拼天影沉默哈喽大家好,我是神探小柳,上期给大家讲了天影沉默的装备,今天给大家讲讲里面的BOSS。新手BOSS绿林大盗,玛雅巨兽,钢铁侠,黑风大当家,山寨小旋风。进阶BOSS尸王剧毒,半兽统领禁止取原神相关名字?幻塔原神提瓦特公会,系统强制改名随着科技的进步,玩家们可以接触到的事物也越来越多,可供选择的电子游戏的类型也越来越丰富。曾经玩一个网游,玩家们相对专一一些,鲜少有精力同时去玩其它同类型游戏。现在则不然,相信正在看DNF大转移前的最后回忆二今天的照片就是第二部分了,把昨天没有发完的都发完了,大转移的话,也就是在85版本,后我们就迎来了团本的时代,王八的降临从乌龟开始我们就开始了在地下城的上班活动,每周不停的在打团打团绝地求生APL天霸成抗韩最大功臣,首日以10个击杀位居第三绝地求生APL职业赛S2在企鹅电竞正式开启到来了。众所周知,APL职业赛并不仅仅只是国内顶级战队加入,同时还有其他外卡战队一同参加比赛。所以在今天的第一天比赛中,更多的是让各大战队Steam动作游戏乱揍派对限时特惠开启!支持简中由游戏开发商RebuiltGames制作并发行的动作游戏乱揍派对(PummelParty)现已在Steam平台开启特惠促销活动,游戏原价50元,40折扣后价格为30元,截止日期为1魔兽怀旧服策划醒悟了,以前一直想淘汰的玩家,却是游戏的主力游戏中我们是朋友,聊天侃地,在这里我们可以无拘无束地发言,不会有任何人阻挠,还有大家最喜欢喷的小编,请把口水收集好,随时准备和小编一起对喷!魔兽怀旧服策划醒悟了,以前一直想淘汰的玩在这款游戏中化身小男孩逃脱极度阴间的儿时梦魇小小梦魇2作为小小梦魇的正统续作,原班人马的打造与新技术的引进使得本作在完美继承了一代优秀剧情与精良配乐的基础上,画面表现力氛围感染力也更上一层楼,沉浸感十足。在游戏中,我们将扮演原神令萌新玩家懵逼的成就,完成需要花费一百三十万摩拉时至今日,玩家在原神当中所玩过的活动不计其数了吧?但是你要说那个活动能和成就系统挂上钩,想必也是刚过完的潜行活动吧,那时我们还在玩着狗含剑这样的梗,转眼间却成为了我们的伙伴,虽说不云游戏苹果手机不需要各类签,点开即玩游戏啦据Newzoo发布的2021年全球云游戏报告显示,2020年全球云游戏市场创造了6。69亿美元,到2021年这一数字将翻一番多,达到16亿美元。预计2021年全球云游戏市场将持续健热血传奇游戏中隐藏的BOSS你遇到过几个?作为最早的网络游戏,热血传奇打怪,帮派和其他新奇的游戏玩法一旦在线吸引了无数的玩家,即使在今天游戏行业的快速发展中,仍然有大量的老玩家。但你对传奇游戏中的经典隐藏boss了解多少呢天地劫手游分享一个月卡平民能选到主力的S4流火15人盒子作者NGAthuyud08RT,每月不超过36元的纯月卡党盒子,特点是所有同职业同属性角色都能连在一起消除能保证2手pick主力(黎幽曹沁无邪等)的情况下开阵。1本赛季还留有尉迟依