博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AsyncContext的startAsync()方法开启异步
阅读量:6708 次
发布时间:2019-06-25

本文共 1102 字,大约阅读时间需要 3 分钟。

Servlet 3.0的支持特性,使Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该 Servlet 线程。在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线程来完成,自己在不生成响应的情况下返回至容器。针对业务处理较耗时的情况,这将大大减少服务器资源的占用,并且提高并发处理速度

1、传统Servlet处理
Web容器会为每个请求分配一个线程,默认情况下,响应完成前,该线程占用的资源都不会被释放。若有些请求需要长时间(例如长处理时间运算、等待某个资源),就会长时间占用线程所需资源,若这类请求很多,许多线程资源都被长时间占用,会对系统的性能造成负担。
2、新特性:
Servlet 3.0新增了,可以先释放容器分配给请求的线程与相关资源,减轻系统负担,原先释放了容器所分配线程的请求,其响应将被延后,可以在处理完成(例如长时间运算完成、所需资源已获得)时再对客户端进行响应。
Servlet 3.0 之前,一个普通 Servlet 的主要工作流程大致如下:
第一步,Servlet 接收到请求之后,可能需要对请求携带的数据进行一些预处理;
第二步,调用业务接口的某些方法,以完成业务处理;
第三步,根据处理的结果提交响应,Servlet 线程结束。
其中第二步的业务处理通常是最耗时的,这主要体现在数据库操作,以及其它的跨网络调用等,在此过程中,Servlet 线程一直处于,直到业务方法执行完毕。在处理业务的过程中,Servlet 资源一直被占用而得不到释放,对于并发较大的应用,这有可能造成性能的瓶颈。对此,在以前通常是采用私有解决方案来提前结束 Servlet 线程,并及时释放资源。
Servlet 3.0 针对这个问题做了开创性的工作,现在通过使用 Servlet 3.0 的异步处理支持,之前的 Servlet 处理流程可以调整为如下的过程:
第一步,Servlet 接收到请求之后,可能首先需要对请求携带的数据进行一些预处理;
第二步,Servlet 线程将请求转交给一个异步线程来执行业务处理,线程本身返回至容器,
第三步,Servlet 还没有生成响应数据,异步线程处理完业务以后,可以直接生成响应数据(异步线程拥有 ServletRequest 和 ServletResponse 对象的引用),或者将请求继续转发给其它 Servlet。
Servlet 线程不再是一直处于以等待的处理,而是启动异步线程之后可以立即返回。

转载于:https://www.cnblogs.com/zuochanzi/p/9612727.html

你可能感兴趣的文章
win7下安装telnet
查看>>
CCNA-(3)-了解什么是网络
查看>>
blob数据输出到页面显示图片(都实证好用的代码)
查看>>
redis+keepalived 主从热备 实例
查看>>
Eclipse上通过Pydev使用python
查看>>
位图和SVG用法比较
查看>>
Linux 管理文件与目录
查看>>
使用jvisualvm 来优化eclipse启动
查看>>
杂了个谈(二)——Markdown简易教程
查看>>
【AngularJs错误】安全限制导致资源路径不可用
查看>>
正则表达式API
查看>>
IDEA-Create Git Repository
查看>>
elasticsearch-更新文档
查看>>
【示例教程】LEADTOOLS中如何用H.264压缩视频创建DICOM文件
查看>>
关于vi不能保存数据的一中解决办法
查看>>
让我们来谈谈对Linux的认识,值得每一位运维人员深读
查看>>
如何清理Docker占用的磁盘空间?
查看>>
sql中的连接查询
查看>>
java多线程之内存可见性
查看>>
vue打包报错UnhandledPromiseRejectionWarning: postcss-svgo: Error in parsing SVG的解决方案
查看>>