Servlet3.0异步请求监听器AsyncListener

小结

HttpServletRequest对象中获得一个【AsyncContext】对象,该对象构成了异步处理的上下文,
【Request】和【Response】对象都可从中获取。

AsyncContext可以从【当前线程A】传给【另外的线程B】,并在【线程B】中完成对请求的【处理】并
【返回结果】给客户端,这样【线程A】便可以【还回给Servlet容器的线程池】以处理更多的连接请求。

需要理解为什么还给Servlet:因为一个服务可以同时处理多个请求,取决于Servlet线程池的线程数。

注意【另外的线程】是从哪里来的,其实可以从Servlet容器申请新的线程,当然【另外的线程】也可以从容器中获取,
比如容器中定义一个线程池,这个线程池和Servlet的线程池是两个不一样的。


但是在这个过程中,请求发起方是一直连着的,只是Servlet线程池的线程,腾出来了,
这种好处就是Servlet可以同时处理更多的请求,因为Servlet的线程池是一个有限数量。
而应用的线程池可以非常多,利用这个方式,
就可以解决,Sevlet因为线程池有限,到时同时处理请求的吞吐量有限的问题。
3.0的改进】只是,AysnContext可以通过应用服务的异步来处理。

【3.1改进】:引入了非阻塞IO:这里是非阻塞Io是指?  
也就是在线程从request获取数据或者写入数据到Response都是要通过网卡,
那么久存在用户态阻塞等待内核态数据缓冲区的数据准备好,这里就实现了监听事件,
不需要一直等待。

注意:需要理解的一个点就是,网络请求发送方到服务端,这个过程中,请求一直是占着的,
不会断,只有等服务端有了响应连接才会断,NIO和多路复用器和这个是没有关系的,
他们解决的是用户态和内核态数据读取和写入的问题。

这篇文章介绍了《跳转》,分别从Servlet容器中拿一个新的线程处理请求,和不从Servlet拿线程处理请求。

一、传统的接收请求

浏览器发送请求->Servlet的线程池接受请求->处理完把结果返回给浏览器

在这个过程中,Servlet的线程池接受浏览器请求的线程,不会释放连接,而且这个线程也一直被霸占着。那么有个问题,服务器处理浏览器请求进来的并发数有限,当请求很大并且每个线程很耗时的时候,线程得不到释放,很影响服务的吞吐量。

由于请求处理线程的总数是有限的,以上特殊请求会出现请求线程不够用的请求,因为可能都处于阻塞状态,影响服务器的吞吐量.所以就得使用异步请求,这也是高性能的关键。

服务器接受请求的吞吐量取决于Servlet线程池,这个线程池的最大线程数和队列是可以配置的,配置类ServerProperties

二、异步请求技术

对于异步请求操作来说,Servlet处理线程在处理请求上大大减少了时间,仅仅是接收了请求之后唤醒了新的业务处理线程,然后就结束了.这样的话,Servlet线程就可以留出多余的时间去处理其他的请求.提高了服务器的吞吐量。

注:Servler去处理其他请求,原来的连接是不会断的,也就是说同步处理的时候,连接占着,线程阻塞只有等连接断开,线程才会空闲。异步是连接占着,线程也是空闲,而且连接不会断。比如jetty服务器就实现了异步请求,只是那是比较早期的操作了,现在有些框架也是有异步模块的,比如spring mvc,但在 JavaWeb中,其最根本的还是 Servlet3.0 的异步请求规范。也叫服务器推,用的是【非阻塞I/O】技术

注意:同步是连接等到线程返回,异步是监听,触发逻辑是不一样的。

三、异步请求监听器接口AsyncListener

Servlet 3.0 为异步处理提供了一个监听器,使用 AsyncListener 接口表示。此接口负责管理异步事件,它可以监控如下四种事件:

  1. 异步线程开始时,调用AsyncListener的onStartAsync(AsyncEvent event)方法;
  2. 异步线程出错时,调用AsyncListener的onError(AsyncEvent event)方法;
  3. 异步线程执行超时,则调用AsyncListener的onTimeout(AsyncEvent event)方法;
  4. 异步执行完毕时,调用AsyncListener的onComplete(AsyncEvent event)方法;

案例

1、从httpServletRequest里面拿到AsyncContext
2、往AsyncContext里面添加异步监听器
3、把AsyncContext交给【应用线程池】去执行

本文转至:https://www.jianshu.com/p/e6e2cbc9b08d

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值