广告位联系
返回顶部
分享到

Java Servlet异步请求开启的简单步骤介绍

java 来源:互联网 作者:秩名 发布时间:2022-02-06 21:12:53 人浏览
摘要

1. 背景 在研究长轮询的实现过程,有使用到Servlet3的异步请求。下面就来学习一下Servlet3的异步请求 现在Servlet的版本已经到了5 2. Servlet同步请求 以Tomcat服务器为例: Http请求到达Tomca

1. 背景

在研究长轮询的实现过程,有使用到Servlet3的异步请求。下面就来学习一下Servlet3的异步请求

现在Servlet的版本已经到了5

2. Servlet同步请求

以Tomcat服务器为例:

  • Http请求到达Tomcat
  • Tomcat从线程池中取出线程处理到达Tomcat的请求
  • 将请求Http解析为HttpServletRequest
  • 分发到具体Servlet处理对应的业务
  • 通过HttpServletResponse返回处理的数据

正常情况下请求模型和上面的模型一样,所有的请求交给Tomcat服务器的线程池处理,整个动作处理完成才释放回线程池。
这里就存在了一个问题如果后期的业务处理时间比较长。那么处理请求的线程就会被一直占用。当请求越来越多被占用的线程也会越来越多。直到被耗尽线程池中所有的线程。后续进来的就一直被阻塞等待线程来处理。

当用户不关心提交的返回可以定义业务处理线程池,前端请求提交后,Tomcat线程将处理提交给业务线程池立即返回。Spring 中的异步任务(@Async)就是这样的。

3. Servlet异步请求

同样以Tomcat服务为例:

  • 将请求Http解析为HttpServletRequest
  • 分发到具体Servlet处理,将业务提交给自定义业务线程池,Tomcat线程立刻被释放。
  • 当业务线程将任务执行结束,将会将结果转交给Tomcat线程池。
  • 通过HttpServletResponse返回处理的数据

引入异步Servlet3整体流程:

使用异步 Servelt,Tomcat 线程仅仅处理请求解析动作,所有耗时较长的业务操作全部交给业务线程池,所以相比同步请求, Tomcat 线程可以处理 更多请求。虽然将业务交给了业务流程处理,但是前端还在等待结果返回(同步等待返回)。

异步处理,前端会同步等待结果返回。很多人会觉得异步请求会返回更快。其实不然由于异步存在线程的切换。所有返回时间会比同步的慢。

虽然没有降低相应时间但是还是有其他明显的优点:

  • 可以处理更高并发连接数,提高系统整体吞吐量
  • 请求解析与业务处理完全分离,职责单一
  • 自定义业务线程池,我们可以更容易对其监控,降级等处理
  • 可以根据不同业务,自定义不同线程池,相互隔离,不用互相影响

4. 异步Servlet使用方法

使用异步Servlet只需要三步:

  • HttpServletRequest#startAsync() 获取 AsyncContext 异步上下文
  • 使用自定义业务线程池处理业务
  • AsyncContext#getResponse() 返回处理结果给前端,然后调用 AsyncContext#complete()

5. Spring中的实现例子

代码如下图:

  • 开启异步Servlet
  • 模拟业务执行
  • 返回结果给前端

前面有说过前端是一直在同步等待的我们通过运行代码来验证一下。结果如下图:

代码地址:github.com/mxsm/spring…

附:异步对象监听器

在异步对象完成、超时、错误或者开始时监听

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

//获取异步上下文对象

AsyncContext ac=req.startAsync();

ac.addListener(new AsyncListener() {

    @Override

    public void onComplete(AsyncEvent asyncEvent) throws IOException {

         

    }

 

    @Override

    public void onTimeout(AsyncEvent asyncEvent) throws IOException {

 

    }

 

    @Override

    public void onError(AsyncEvent asyncEvent) throws IOException {

 

    }

 

    @Override

    public void onStartAsync(AsyncEvent asyncEvent) throws IOException {

 

    }

});


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://juejin.cn/post/7060323697298505741
相关文章
  • SpringBoot自定义错误处理逻辑介绍

    SpringBoot自定义错误处理逻辑介绍
    1. 自定义错误页面 将自定义错误页面放在 templates 的 error 文件夹下,SpringBoot 精确匹配错误信息,使用 4xx.html 或者 5xx.html 页面可以打印错误
  • Java实现手写一个线程池的代码

    Java实现手写一个线程池的代码
    线程池技术想必大家都不陌生把,相信在平时的工作中没有少用,而且这也是面试频率非常高的一个知识点,那么大家知道它的实现原理和
  • Java实现断点续传功能的代码

    Java实现断点续传功能的代码
    题目实现:网络资源的断点续传功能。 二、解题思路 获取要下载的资源网址 显示网络资源的大小 上次读取到的字节位置以及未读取的字节
  • 你可知HashMap为什么是线程不安全的
    HashMap 的线程不安全 HashMap 的线程不安全主要体现在下面两个方面 在 jdk 1.7 中,当并发执行扩容操作时会造成环形链和数据丢失的情况 在
  • ArrayList的动态扩容机制的介绍

    ArrayList的动态扩容机制的介绍
    对于 ArrayList 的动态扩容机制想必大家都听说过,之前的文章中也谈到过,不过由于时间久远,早已忘却。 所以利用这篇文章做做笔记,加
  • JVM基础之字节码的增强技术介绍

    JVM基础之字节码的增强技术介绍
    字节码增强技术 在上文中,着重介绍了字节码的结构,这为我们了解字节码增强技术的实现打下了基础。字节码增强技术就是一类对现有字
  • Java中的字节码增强技术

    Java中的字节码增强技术
    1.字节码增强技术 字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。 参考地址 2.常见技术 技术分类 类
  • Redis BloomFilter布隆过滤器原理与实现

    Redis BloomFilter布隆过滤器原理与实现
    Bloom Filter 概念 布隆过滤器(英语:Bloom Filter)是1970年由一个叫布隆的小伙子提出的。它实际上是一个很长的二进制向量和一系列随机映射
  • Java C++算法题解leetcode801使序列递增的最小交换次

    Java C++算法题解leetcode801使序列递增的最小交换次
    题目要求 思路:状态机DP 实现一:状态机 Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Solution { public int minSwap(int[] nums1, int[] nums2) { int n
  • Mybatis结果集映射与生命周期介绍

    Mybatis结果集映射与生命周期介绍
    一、ResultMap结果集映射 1、设计思想 对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了 2、resultMap的应用场
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计