返回顶部
首页 > 资讯 > 精选 >浅谈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://lsjlt.com/news/222180.html(转载时请注明来源链接)

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

猜你喜欢
  • 浅谈servlet3异步原理与实践
    一、什么是Servletservlet 是基于 Java 的 Web 组件,由容器进行管理,来生成动态内容。像其他基于 Java 的组件技术一样,servlet 也是基于平台无关的 Java 类格式,被编译为平台无关的字节码,可以被基于 J...
    99+
    2023-05-31
    servlet 异步
  • 浅谈swoole的作用与原理
    目录PHP 中的 Node ?Swoole 到底是什么?如何让它运行?使用 Docker 运行 SwooleSwoole 可以做什么?基于 Swoole 实现 HTTP 服务HTTP...
    99+
    2024-04-02
  • 浅谈Webpack4 plugins 实现原理
    目录前言认识实践出真知前言 在 wabpack 中核心功能除了 loader 应该就是 plugins 插件了,它是在webpack执行过程中会广播一系列事件,plugin 会监听...
    99+
    2024-04-02
  • 浅谈Vue插槽实现原理
    目录一、样例代码二、透过现象看本质三、实现原理四、父组件编译阶段五、父组件生成渲染方法六、父组件生成VNode七、子组件状态初始化八、子组件编译阶段九、子组件生成渲染方法十、使用技巧...
    99+
    2024-04-02
  • 浅谈React底层实现原理
    目录1. props,state与render函数关系,数据和页面如何实现互相联动?2. React中的虚拟DOM常规思路改良思路(仍使用DOM)React的思路深入理解虚拟DOM3...
    99+
    2024-04-02
  • 【深入浅出】VUE 计算属性的原理与实践
    Vue、计算属性、衍生数据、watcher、缓存 一、计算属性的原理 计算属性是 Vue.js 中一种用来计算数据的特殊属性。它将一个 JavaScript 方法与一个 getter 关联起来,当该属性被访问时,方法就会被执行并返回计算...
    99+
    2024-02-20
    Vue 计算属性是一种方便快捷的计算衍生数据的工具。本文将深入浅出地讲解计算属性的原理和使用方法 并通过实际示例演示其应用场景 帮助你掌握这一常用特性。
  • RiSearch PHP 原理与实践
    摘要:RiSearch是一种全文搜索引擎,它基于PHP编程语言,并提供了强大的搜索功能。本文将介绍RiSearch的原理,并提供一些实例代码,帮助读者理解和实践RiSearch的用法。引言在当今互联网时代,搜索功能已经成为了各种网站和应用程...
    99+
    2023-10-21
    PHP 原理与实践 关键词:RiSearch
  • 浅谈什么是SpringBoot异常处理自动配置的原理
    异常处理自动配置 ErrorMvcAutoConfiguration自动配置类自动配置了处理规则,给容器中注册了多种组件 errorAttributes组件,类型为DefaultEr...
    99+
    2024-04-02
  • 浅谈express 中间件机制及实现原理
    简介 中间件机制可以让我们在一个给定的流程中添加一个处理步骤,从而对这个流程的输入或者输出产生影响,或者产生一些中作用、状态,或者拦截这个流程。中间件机制和tomcat的过滤器类似,这两者都属于责任链模式...
    99+
    2022-06-04
    浅谈 中间件 原理
  • Python异步爬虫实现原理与知识总结
    目录一、背景二、多线程实现三、协程实现四、多任务协程实现一、背景 默认情况下,用get请求时,会出现阻塞,需要很多时间来等待,对于有很多请求url时,速度就很慢。因为需要一个url请...
    99+
    2024-04-02
  • 浅谈Java中的atomic包实现原理及应用
    1.同步问题的提出假设我们使用一个双核处理器执行A和B两个线程,核1执行A线程,而核2执行B线程,这两个线程现在都要对名为obj的对象的成员变量i进行加1操作,假设i的初始值为0,理论上两个线程运行后i的值应该变成2,但实际上很有可能结果为...
    99+
    2023-05-30
    java atomic 原理
  • 浅谈SpringBoot实现自动装配的方法原理
    目录1. 什么是自动装配2. 自动装配的原理3. 自动装配的步骤4. 自定义自动配置5.代码案例总结1. 什么是自动装配 在传统的Spring框架中,我们需要手动配置和管理Bean的...
    99+
    2023-05-20
    SpringBoot实现自动装配 SpringBoot自动装配
  • 怎么浅谈安卓apk加固原理和实现
    今天就跟大家聊聊有关怎么浅谈安卓apk加固原理和实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。下面主要向大家介绍apk加固原理和简单实现。一、apk常见加固方式(1)代码层级加密...
    99+
    2023-06-04
  • Thinkphp语言包实现原理与实践
    我们知道,Thinkphp中支持语言包功能。ThinkPHP具备语言包定义、自动识别、动态定义语言参数的功能。 首先我们来说语言文件名称,该文件名称是受我们控制的,我们可以在底层配置文件conven...
    99+
    2024-02-27
  • 异步编程与存储:PHP的实时应用实践
    随着计算机技术的不断发展,异步编程模式越来越被广泛应用。在PHP编程中,异步编程是一种非常重要的技术,可以提高程序运行效率和性能。本文将介绍异步编程与存储在PHP中的实时应用实践。 异步编程是什么? 异步编程是一种编程模式,它可以在程序执...
    99+
    2023-10-07
    实时 异步编程 存储
  • 浅谈线性表的原理及简单实现方法
    一、线性表原理:零个或多个同类数据元素的有限序列原理图:特点 :有序性有限性同类型元素第一个元素无前驱,最后一个元素无后继,中间的元素有一个前驱并且有一个后继线性表是一种逻辑上的数据结构,在物理上一般有两种实现 顺序实现和链表实现二、基于数...
    99+
    2023-05-31
    线性表
  • MySQL 锁的原理与应用实践
    MySQL 锁的原理与应用实践摘要:MySQL 是一种常用的关系型数据库管理系统,它具有强大的并发处理能力。在多用户同时访问数据库时,为了确保数据的一致性和完整性,MySQL 使用锁机制来控制对共享资源的访问。本文将介绍 MySQL 锁的原...
    99+
    2023-12-21
    MySQL 应用实践
  • Redis核心原理与实践之字符串实现原理
    本文分析Redis字符串的实现原理,内容摘自新书《Redis核心原理与实践》。这本书深入地分析了Redis常用特性的内部机制与实现方式,内容源自对Redis源码的分析,并从中总结出设...
    99+
    2024-04-02
  • 浅谈Android实践之ScrollView中滑动冲突处理解决方案
    1. 前言  在Android开发中,如果是一些简单的布局,都很容易搞定,但是一旦涉及到复杂的页面,特别是为了兼容小屏手机而使用了ScrollView以后,就会出现很...
    99+
    2022-06-06
    scrollview 解决方案 Android
  • Python 容器日志同步,深入解析数据同步的原理与实践
    在容器化的应用程序中,容器日志是非常重要的一部分,它可以帮助我们了解应用程序的运行状态、错误信息等。但是,由于容器的特性,日志信息可能会分散在多个容器中,而且容器的生命周期也是短暂的,因此需要一种机制将容器日志同步到一个集中的地方进行存储...
    99+
    2023-11-02
    容器 日志 同步
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作