ServletRequest startAsync()的有用性有限
Runnable
。
AsyncContext
是Servlet 3.0规范中定义的一种标准方式,用于异步处理HTTP请求。 基本上,HTTP请求不再绑定到HTTP线程,这使我们以后可以使用更少的线程来处理它。 事实证明,该规范提供了一个API,用于处理其他不同线程池中的异步线程。 首先,我们将了解该功能在Tomcat和Jetty中是如何被完全破坏和无用的,然后我们将讨论为什么该功能的用途普遍存在疑问。
@WebServlet(urlPatterns = Array("/*"))
class SlowServlet extends HttpServlet with Logging {protected override def doGet(req: HttpServletRequest, resp: HttpServletResponse) {logger.info("Request received")val sleepParam = Option(req.getParameter("sleep")) map {_.toLong}TimeUnit.MILLISECONDS.sleep(sleepParam getOrElse 10)logger.info("Request done")}
}
sleep
参数。 毫不奇怪,一旦我们超过HTTP线程数,响应时间就会开始增加。 第十一连接必须等待任何其他请求完成并释放工作线程。 当并发级别超过100时,Tomcat开始断开连接-太多的客户端已排队。
AsyncContext.start()
方法又如何呢(不要与ServletRequest.startAsync()
混淆)? 根据JavaDoc,我可以提交任何Runnable
,并且容器将使用某些托管线程池来处理它。 这将在一定程度上有所帮助,因为我不再阻止HTTP工作线程(但仍使用servlet容器中某个位置的另一个线程)。 快速切换到异步servlet:
@WebServlet(urlPatterns = Array("/*"), asyncSupported = true)
class SlowServlet extends HttpServlet with Logging {protected override def doGet(req: HttpServletRequest, resp: HttpServletResponse) {logger.info("Request received")val asyncContext = req.startAsync()asyncContext.setTimeout(TimeUnit.MINUTES.toMillis(10))asyncContext.start(new Runnable() {def run() {logger.info("Handling request")val sleepParam = Option(req.getParameter("sleep")) map {_.toLong}TimeUnit.MILLISECONDS.sleep(sleepParam getOrElse 10)logger.info("Request done")asyncContext.complete()}})}
}
sleep()
移至Runnable
并希望移至其他线程池中,从而释放HTTP线程池。 快速压力测试揭示了一些出乎意料的结果(此处:响应时间与并发连接数):
AsyncContext.start()
,Tomcat将给定的任务提交回……HTTP工作线程池,即用于所有HTTP请求! 基本上,这意味着我们发布了一个HTTP线程,只是为了在稍后的一毫秒内使用(甚至可能是同一线程)。 在Tomcat中调用AsyncContext.start()
绝对没有好处。 我不知道这是错误还是功能。 一方面,这显然不是API设计人员想要的。 假定servlet容器管理单独的独立线程池,因此HTTP工作线程池仍然可用。 我的意思是,异步处理的全部目的是逃避HTTP池。 Tomcat假装将我们的工作委托给另一个线程,而它仍然使用原始的工作线程池。
AsyncContext.start()
都是没有意义的,并且只会不必要地使代码复杂化。 它不会给您任何好处,该应用程序在高负载下的工作原理完全相同,就好像根本没有异步逻辑一样。
AsyncContext.start()
将在单独的线程池中运行提供的Runnable
。 您的应用程序仍然可以响应,可以处理普通的请求,而您决定异步处理的长期运行的请求则在单独的线程池中处理。 更好的是,不幸的是线程池和每个连接线程的成语仍然是瓶颈。 对于JVM,启动什么类型的线程都没有关系–它们仍然占用内存。 因此,我们不再阻塞HTTP工作线程,但就我们可以支持的并发长期运行任务而言,我们的应用程序具有更大的可伸缩性。
AsyncContext.start()
来支持数千个并发(等待)连接。 你知道如何? 提示: ScheduledExecutorService
。
implicit def blockToRunnable[T](block: => T) = new Runnable {def run() {block}
}
Runnable
:
asyncContext start {logger.info("Handling request")val sleepParam = Option(req.getParameter("sleep")) map { _.toLong}TimeUnit.MILLISECONDS.sleep(sleepParam getOrElse 10)logger.info("Request done")asyncContext.complete()
}
翻译自: https://www.javacodegeeks.com/2012/05/servletrequest-startasync-limited.html
ServletRequest startAsync()的有用性有限相关推荐
- ServletRequest startAsync()的用途有限
前段时间我遇到了Servlet 3.0中AsyncContext.start(-)的目的是什么? 题. 引用上述方法的Javadoc : 使容器调度线程(可能从托管线程池中)运行指定的Runnable ...
- 中国人民大学文继荣:搜索,从相关性到有用性
整理 | Mr Bear 在今年智源大会上,中国人民大学高领人工智能学院执行院长.北京智源人工智能研究院首席科学家文继荣教授以「从相关性到有用性」为线索,对搜索技术的发展历程以及未来的研究方向进行了梳 ...
- 关于在线评论有用性的论文研读笔记---51-60篇
51.Evaluating key antecedents and consequences of the perceived helpfulness of online consumer revie ...
- 关于在线评论有用性的论文研读笔记---10篇
目录 1 在线评论的行为影响与价值应用研究综述(中国管理科学) 2 评论有用性相关的论文 2.1 基于知识采纳模型和多层感知机神经网络的评论有用性识别研究(中国管理科学) 2.2 消费者认为怎样的在线 ...
- 关于在线评论有用性的论文研读笔记---41-50篇
目录 41.The power of numbers: an examination of the relationship between numerical cues in online revi ...
- 文献阅读_基于多模态数据语义融合的旅游在线评论有用性识别研究
文献来源:马超,李纲,陈思菁,毛进,张霁.基于多模态数据语义融合的旅游在线评论有用性识别研究[J].情报学报,2020,39(02):199-207. 基于多模态数据语义融合的旅游在线评论有用性识别研 ...
- 关于在线评论有用性的论文研读笔记---21-30篇
目录 21.A study of factors that contribute to online review helpfulness. (Computers in Human Behavior) ...
- 关于在线评论有用性的论文研读笔记---11-20篇
目录 11.基于多模态数据语义融合的旅游在线评论有用性识别研究(情报学报) 12.基于内容特征的评论效用排名预测--以豆瓣书评为例(管理评论) 13.面向用户信息需求的移动O2O在线评论有用性排序模型 ...
- 可用性测试易用性和有用性_选择您的可用性测试和参与者
可用性测试易用性和有用性 In my last article, we talked about ways to really nail down your usability goals befor ...
最新文章
- 【音频】Faad源码交叉编译
- dot3_bump_mapping
- 程序员那些年的斗智斗勇!!!
- ExpressionFuncT,TResult和FuncT,TResult
- 批处理(cmd)的学习记录
- JavaScript——自定义对话框
- 基于Node的PetShop,RESTful API以及认证
- MySQL-5.5.33主从复制
- .NET截取指定长度汉字超出部分以...代替
- CVPR2021 Oral | HOTR:不再需要后处理!Kakao Brain提出端到端Human-Object交互检测模型...
- 成田机场坐access到品川_东京旅游---成田机场到东京市内的最全交通指南!
- 史上最全GIS相关软件(CAD、FME、Arcgis、ArcgisPro)
- LaTeX常用符号(持续更新)
- 数据库分库分表可扩展及数据倾斜/热点问题(二)
- Link warning:LNK4199 解决
- 计算机二级考试vb试题,2016计算机二级考试《VB》真题练习
- LabVIEW如何开发大型程序
- PRA是个啥?老板表示很满意!
- JS - 13 - 模块化
- Nirvana Chain 为应用而生技术交流酒会在成都成功举办
热门文章
- AVL树的单双旋转解析
- apache.camel_Apache Camel 3.1 –更多骆驼核心优化(第2部分)
- netsuite 数据集成_Java中带有NetSuite数据实体的对象关系映射(ORM)
- 服务器编写_编写下载服务器。 第六部分:描述您发送的内容(内容类型等)...
- 用户控件 自定义控件_新的自定义控件:TaskProgressView
- Selenium WebDriver中的TestNG侦听器及示例
- nodemanager_如何使用NodeManager来控制WebLogic Server
- 不知所措:您是否真的需要为您的API提供客户端库?
- idea 编写javafx_用JavaFX编写图块引擎
- 使用Arquillian测试Spring Data + Spring Boot应用程序(第1部分)