广告
返回顶部
首页 > 资讯 > 精选 >浅谈servlet3异步原理与实践
  • 235
分享到

浅谈servlet3异步原理与实践

servlet异步 2023-05-31 00:05:36 235人浏览 八月长安
摘要

一、什么是Servletservlet 是基于 Java 的 WEB 组件,由容器进行管理,来生成动态内容。像其他基于 Java 的组件技术一样,servlet 也是基于平台无关的 Java 类格式,被编译为平台无关的字节码,可以被基于 J

一、什么是Servlet

servlet 是基于 Java 的 WEB 组件,由容器进行管理,来生成动态内容。像其他基于 Java 的组件技术一样,servlet 也是基于平台无关的 Java 类格式,被编译为平台无关的字节码,可以被基于 Java 技术的 Web 服务器动态加载并运行。容器(Container),有时候也叫做 servlet 引擎,是 Web 服务器为支持 servlet 功能扩展的部分。客户端通过 servlet 容器实现的 request/response paradigm(请求/应答模式) 与 Servlet 进行交互。

二、什么是Servlet规范

每当一个Servlet版本发布都会对应一个Servlet版本的规范,比如Servlet2.5、Servlet3.0、Servlet3.1.
规范中描述了Java Servlet api 的标准,定义了 Java Servlet API 中类、接口、方法签名的完整规范且附带的Javadoc 文档供开发人员查阅,目的主要是为Java Servlet 给出一个完整和清晰的解释。从下图可以看出Servlet规范版本和Tomcat支持的版本的对应关系。比如Servlet3是从tomcat7以后开始支持的。

浅谈servlet3异步原理与实践

Servlet和tomcat版本.png

三、同步,异步,阻塞,非阻塞

同步异步是数据通信的方式,阻塞和非阻塞是一种状态。比如同步这种数据通讯方式里面可以有阻塞状态也可以有非阻塞状态。

四、Servlet3的异步位置

这里说的位置是指,从tomcat处理整个request请求流程中,异步处于哪一步。我们先梳理出在NIO模式下(是否使用Nio跟异步没有直接关系,这里是拿NIO模式下的tomcat流程做说明),下面这个图是tomcat的总体结构,里面用箭头标明了请求线路。

浅谈servlet3异步原理与实践

tomcat架构图.png

我们知道在tomcat的组件中Connector和Engine是最核心的两个组件,Servlet3的异步处理就是发生在Connector中。Tomcat的组件之间的协作关系,后续会单独写一篇文章介绍。这里先有一个直观的认识。便与后续对异步理解。

五、Servlet3的异步流程

浅谈servlet3异步原理与实践

Servlet异步处理流程图.png

接收到request请求之后,由tomcat工作线程httpservletRequest中获得一个异步上下文AsyncContext对象,然后由tomcat工作线程把AsyncContext对象传递给业务处理线程,同时tomcat工作线程归还到工作线程池,这一步就是异步开始。在业务处理线程中完成业务逻辑的处理,生成response返回给客户端。在Servlet3.0中虽然处理请求可以实现异步,但是InputStream和OutputStream的IO操作还是阻塞的,当数据量大的request body 或者 response body的时候,就会导致不必要的等待。从Servlet3.1以后增加了非阻塞IO,需要tomcat8.x支持。

六、Servlet3的异步使用步骤

我们使用的大致步骤如下:

声明Servlet,增加asyncSupported属性,开启异步支持。@WebServlet(urlPatterns = "/AsyncLongRunningServlet", asyncSupported = true)
2、通过request获取异步上下文AsyncContext。AsyncContext asyncCtx = request.startAsync();
3、开启业务逻辑处理线程,并将AsyncContext 传递给业务线程。executor.execute(new AsyncRequestProcessor(asyncCtx, secs));
4、在异步业务逻辑处理线程中,通过asyncContext获取request和response,处理对应的业务。
5、业务逻辑处理线程处理完成逻辑之后,调用AsyncContext 的complete方法。asyncContext.complete();从而结束该次异步线程处理。

七、Servlet3的异步使用示例

1、AsyncLongRunningServlet.java 处理Servlet请求,并开启异步

package com.test.servlet3;import javax.servlet.AsyncContext;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.Http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.util.concurrent.ThreadPoolExecutor;@WebServlet(urlPatterns = "/AsyncLongRunningServlet", asyncSupported = true)public class AsyncLongRunningServlet extends HttpServlet {  private static final long serialVersionUID = 1L;  protected void doGet(HttpServletRequest request,             HttpServletResponse response) throws ServletException, IOException {    long startTime = System.currentTimeMillis();    System.out.println("AsyncLongRunningServlet Start::Name="        + Thread.currentThread().getName() + "::ID="        + Thread.currentThread().getId());    request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);    String time = request.getParameter("time");    int secs = Integer.valueOf(time);    // max 10 seconds    if (secs > 10000)      secs = 10000;    AsyncContext asyncCtx = request.startAsync();    asyncCtx.addListener(new AppAsyncListener());    asyncCtx.setTimeout(9000);//异步servlet的超时时间,异步Servlet有对应的超时时间,如果在指定的时间内没有执行完操作,response依然会走原来Servlet的结束逻辑,后续的异步操作执行完再写回的时候,可能会遇到异常。    ThreadPoolExecutor executor = (ThreadPoolExecutor) request        .getServletContext().getAttribute("executor");    executor.execute(new AsyncRequestProcessor(asyncCtx, secs));    long endTime = System.currentTimeMillis();    System.out.println("AsyncLongRunningServlet End::Name="        + Thread.currentThread().getName() + "::ID="        + Thread.currentThread().getId() + "::Time Taken="        + (endTime - startTime) + " ms.");  }}

--结束END--

本文标题: 浅谈servlet3异步原理与实践

本文链接: https://www.lsjlt.com/news/222180.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅谈servlet3异步原理与实践
    一、什么是Servletservlet 是基于 Java 的 Web 组件,由容器进行管理,来生成动态内容。像其他基于 Java 的组件技术一样,servlet 也是基于平台无关的 Java 类格式,被编译为平台无关的字节码,可以被基于 J...
    99+
    2023-05-31
    servlet 异步
  • Python异步爬虫实现原理与知识总结
    目录一、背景二、多线程实现三、协程实现四、多任务协程实现一、背景 默认情况下,用get请求时,会出现阻塞,需要很多时间来等待,对于有很多请求url时,速度就很慢。因为需要一个url请...
    99+
    2022-11-12
  • Python 容器日志同步,深入解析数据同步的原理与实践
    在容器化的应用程序中,容器日志是非常重要的一部分,它可以帮助我们了解应用程序的运行状态、错误信息等。但是,由于容器的特性,日志信息可能会分散在多个容器中,而且容器的生命周期也是短暂的,因此需要一种机制将容器日志同步到一个集中的地方进行存储...
    99+
    2023-11-02
    容器 日志 同步
  • 异步编程与大数据处理:Python 教程中的最佳实践
    在大数据处理中,异步编程是一种非常重要的技术。与传统的同步编程相比,异步编程可以大大提高程序的性能和效率。Python 语言也提供了异步编程的支持。在本文中,我们将介绍 Python 中的异步编程,以及如何使用它来处理大数据。 一、Pyt...
    99+
    2023-09-29
    教程 大数据 异步编程
  • 大数据处理必备:Python异步编程实现原理与应用
    大数据处理是当前互联网时代的必要技能,Python是大数据处理的重要工具之一,而Python异步编程则是优化大数据处理效率的关键技术之一。本文将为你介绍Python异步编程的实现原理和应用,帮助你更好地掌握大数据处理技能。 一、Python...
    99+
    2023-08-04
    索引 异步编程 大数据
  • 详解node单线程实现高并发原理与node异步I/O
    一、node单线程实现高并发原理 众所周知nodejs是单线程且支持高并发的脚本语言。可为什么单线程的nodejs可以支持高并发呢?很多人都不明白其原理,下面我来谈谈我的理解: 1. node的优点:I/O...
    99+
    2022-06-04
    详解 单线程 原理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作