在研究长轮询的实现过程,有使用到rvlet3的异步请求。下面就来学习一下rvlet3的异步请求
现在rvlet的版本已经到了5
以tomcat服务器为例:
http请求到达tomcattomcat从线程池中取出线程处理到达tomcat的请求将请求http解析为httprvletrequest分发到具体rvlet处理对应的业务通过httprvletrespon返回处理的数据正常情况下请求模型和上面的模型一样,所有的请求交给tomcat服务器的线程池处理,整个动作处理完成才释放回线程池。
这里就存在了一个问题如果后期的业务处理时间比较长。那么处理请求的线程就会被一直占用。当请求越来越多被占用的线程也会越来越多。直到被耗尽线程池中所有的线程。后续进来的就一直被阻塞等待线程来处理。
当用户不关心提交的返回可以定义业务处理线程池,前端请求提交后,tomcat线程将处理提交给业务线程池立即返回。spring 中的异步任务(@async)就是这样的。
同样以tomcat服务为例:
将请求http解析为httprvletrequest分发到具体rvlet处理,将业务提交给自定义业务线程池,tomcat线程立刻被释放。当业务线程将任务执行结束,将会将结果转交给tomcat线程池。通过httprvletrespon返回处理的第一人称数据引入异步rvlet3整体流程:
使用异步 rvelt,tomcat 线程仅仅处理请求解析动作,所有耗时较长的业务操作全部交给业务线程池,所以相比同步请求, tomcat 线程可以处理 更多请求。虽然将业务交给了业务流程处理,但是前端还在等待结果返回(同步等待返回)。
异步处理,前端会同步等待结果返回。很多人会觉得异步请求会返回更快。其实不然由于异步存在线程的切换。所有返回时间会比同步的慢。
虽然没有降低相应时间但是还是有其他明显的优点:
可以处理更高并发连接数,提高系统整体吞吐量请求解析与业务处理完全重生之海耶斯旋风分离,职责单一自定义业务线程池,我们可以更容易对其监控,降级等处理可以根据不同业务,自定义不同线程池,相互隔离,不用互相影响使用异步rvlet只需要三步:
httprvletrequest#startasync() 获取 asynccontext 异步上下文使用自定义业务线程池处理业务asynccontext#getrespon() 返回处理结果给前端,然后调用 asynccontext#complete()代码如下图:
开启异步rvlet模拟业务执行返回结果给前端
前面有说过前端是一直在同步等待的我们通过运行代码来验证一下。结果如下图:
唯美大图代码地址:github.com/mxsm/spring…
在异步对象完成、超时、错误或者开始时监听
//获取异步上下文对象 重阳节古诗 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 { } });
到此这篇关于java rvlet异步请求开启的文章就介绍到这了,更多相关rvlet异步请求开启内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 22:07:24,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/f13d17ec58fedb4a76834aadeaa4c0e6.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Java Servlet异步请求开启的简单步骤.doc
本文 PDF 下载地址:Java Servlet异步请求开启的简单步骤.pdf
留言与评论(共有 0 条评论) |