Servlet3.0异步请求

【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步 阅读详情

Servlet3.0异步请求

在Servlet3.0之前,Servlet采用Thread-Per-Request的方式处理请求

即每次Http请求都有一个线程从头到尾负责处理

如果一个请求需要进行IO操作,比如访问数据库、调用第三方服务接口等,那么其所对应的线程将同步地等待IO操作完成,而IO操作是非常慢的,所以此时的线程不能及时的释放回线城市以供后续使用,在并发量越来越大的情况下,这将带来严重的性能问题。即便是像Spring这样的高层框架也脱离不了这样的束缚。因为他们都是建立在servlet之上的。为了解决这样的问题,Servlet3.0引入了异步处理,然后在Servlet3.1中又引入了非阻塞IO来进一步增强异步处理的性能。

 

同步的例子:

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(Thread.currentThread()+"start...");
        try {
            sayHello();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        resp.getWriter().write("hello");
        System.out.println(Thread.currentThread()+"end...");
    }
     
    public void sayHello() throws InterruptedException {
        System.out.println(Thread.currentThread()+"processing...");
        Thread.sleep(3000);
    }
    
}

请求之后:

 

 开启异步:

@WebServlet(value = "/async", asyncSupported = true) // true 就可以支持异步了
public class HelloAsyncServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        System.out.println("主线程...."+Thread.currentThread());
        AsyncContext startAsync = req.startAsync();
    // 业务逻辑进行异步处理;开启异步处理
        startAsync.start(new Runnable() {

            @Override
            public void run() {
                try {
                    System.out.println("副线程开启...."+Thread.currentThread()+Thread.currentThread()+"==>"+System.currentTimeMillis());
                    sayHello();
                    //获取到异步的上下文
                    AsyncContext asyncContext = req.getAsyncContext();
                    // 获取响应
                    ServletResponse response = asyncContext.getResponse(); //获取交出去的响应
                    response.getWriter().write("hello toov5 async");
                    startAsync.complete();  //异步调用完毕 开始给予响应
                    System.out.println("副线程结束...."+Thread.currentThread()+"==>"+System.currentTimeMillis());
                } catch (InterruptedException | IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
       System.out.println("主线程结束..."+Thread.currentThread()+"==>"+System.currentTimeMillis());
    }

    public void sayHello() throws InterruptedException {
        System.out.println(Thread.currentThread() + "processing...");
        Thread.sleep(3000);
    }
}

结果:

如果开启了异步处理 当前tomcat线程池里的线程立马结束,交给新的异步处理的线程池中的线程去处理

当前这个没有去维护异步处理的线程池。

 

springmvc 会维护一个异步处理的线程池

 这样主线程释放 等待下一个请求

posted @ 2019-04-14 16:11 toov5 阅读(...) 评论(...) 编辑 收藏

华为防火墙NAT避坑指南:当双ISP出口遇到服务器发布,这些细节不注意会翻车 本文深入解析华为防火墙在双ISP出口环境下服务器发布的实战配置,重点探讨no-reverse参数对Server-Map表的影响、源进源出功能的实现及线路切换时的会话保持问题。通过策略路由和智能选路技术,确保HTTP/FTP服务在多运营商链路中的高可用性,避免路径不对称和NAT映射冲突等常见陷阱。 阅读详情

相关推荐

【WILEY】从Revision到Online:一次投稿的完整状态演进与关键节点实战解析

本文详细解析了从Revision到Online发表的完整投稿流程,包括修改稿准备、回复信撰写、状态跟踪等关键节点。特别针对Wiley期刊,提供了实用的操作技巧和常见问题解决方案,帮助作者高效完成论文修改与发表。

weixin_29219189的博客 361

Servlet 3.0/3.1 中的异步处理

 在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理。如果一个请求需要进行IO操作,比如访问数据库、调用第三方服务接口等,那么其所对应的线程将同步地等待IO操作完成, 而IO操作是非常慢的,所以此时的线程并不能及时地释放回线程池以供后续使用,在并发量越来越大的情况下,这将带来严重的性能问题。即便是像...

weixin_34019929的博客 269

BIM Revit教程(六)尝试安装 Revit 时显示“Autodesk Revit 已安装。”

在安装Revit或RevitLT时,若系统提示“AutodeskRevit版本已安装”,通常是由于旧版本残留文件未完全清除所致。解决方案包括:1.通过控制面板或Windows设置卸载旧版本Revit,确保所有相关组件被移除;2.使用Autodesk卸载工具(AdskUninstallHelper)进一步清理;3.谨慎操作注册表,删除与Revit相关的残留项;4.确保系统有至少30GB的可用磁盘空间;5.完成上述步骤后,重新尝试安装Revit。此外,文章还提到了一个免费功能商店,供用户寻找提效工具,并鼓励粉丝

ZOZO_888的博客 2129

Servlet系列之Servlet3异步

入门案例;

lonelymanontheway的博客 1368

【立创开源】太阳能板充电方案单节3.7v锂电池充电

一直对太阳能板感兴趣,老是感觉充电好麻烦,要是放在那里就可以自己充电多好,所以尝试做了一个太阳能充电板。因为这几天都是阴天,所以测试效果不太好,但是下雨天也是能充电的,但是基本只能维持电量不掉,电压差不多4.2v以上,电流只有2mA。中午出太阳的时候,隔着玻璃放在太阳下测试,电流有12mA以上。能充起一点点电。等大晴天看一看能不能达到卖家说50mA。┗( T﹏T )┛感觉达不到。这个东西只能当一个玩具(;′⌒`)。不过如果汽车上一些行车记录仪加一个这个,汽车经常在太阳下停车,可能再也不用充电了。

贾saisai的博客 1万+

生物信息学工具链搭建:用conda一键搞定MCScanX所有依赖(Ubuntu20.04实测)

本文详细介绍了在Ubuntu20.04系统上使用conda一键部署MCScanX及其所有依赖的高效方法,解决了传统源码编译安装中的依赖冲突问题。通过conda环境管理工具,研究者可以快速搭建生物信息学工具链,实现基因组共线性分析的高效运行,显著提升研究效率。

backprop5master的博客 247

servlet异步请求

1、什么是servlet异步请求 Servlet 3.0 之前,一个普通 Servlet 的主要工作流程大致如下: (1)、Servlet 接收到请求之后,可能需要对请求携带的数据进行一些预处理; (2)、调用业务接口的某些方法,以完成业务处理; (3)、根据处理的结果提交响应,Servlet 线程结束。 其中第二步处理业务逻辑时候很可以碰到比较耗时的任务,此时servlet主线程会阻塞等待完成业务处理,对于并发比较大的请求可能会产生性能瓶颈,则servlet3.0之后再此处做了调整,引入了...

liushangzaibeijing的博客 6万+

深入解析TMC2209 UART寄存器配置:从基础指令到高级参数调优

本文深入解析TMC2209 UART寄存器配置,从基础指令到高级参数调优,涵盖电流控制、微步细分等关键设置。通过实战案例和优化技巧,帮助开发者高效配置步进电机驱动,提升系统性能和稳定性。特别介绍了UART通信协议和CRC校验实现,确保数据传输可靠性。

tequila的博客 1159

Servlet 3.0异步处理请求

一、servlet3.0异步请求相关方法startAsync(servletRequest, servletResponse)传入指定的request和response对象,便于在AsyncContext中重复使用(这样被Filter、Servlet包装过的请求、相应对象才会在异步的环境下继续生效)。startAsync()若request或者response被包装,将失去预期的效果。isAsync

Aurora Silent 2135

【Python进阶】VSCode Python开发完全指南:从环境配置到高效调试

本文通过15个实战案例,系统讲解VSCode进行Python开发的环境配置、编码技巧、调试方法及性能优化,帮助初学者快速构建专业开发环境。

赶紧的博客 3761

【数字IC验证快速入门】26、SystemVerilog项目实践之AHB-SRAMC(6)(AHB-SRAMC SVTB Overview)

导读:作者有幸在中国电子信息领域的排头兵院校“电子科技大学”攻读研究生期间,接触到前沿的数字IC验证知识,旁听到诸如华为海思、清华紫光、联发科技等业界顶尖集成电路相关企业面授课程,对数字IC验证有了一些知识积累和学习心得。为帮助想入门前端IC验证的朋友,思忱一二后,特开此专栏,以期花最短的时间,走最少的弯路,学最多的IC验证技术知识。 文章目录一、内容概述二、AHB-SRAMC 验证计划 一、内容概述 AHB-SRAMC 验证计划 AHB-SRAMC 验证平台的架构图 AHB-SRAMC 验证平台的代.

悟已往之不谏 知来者之可追 2652

深入理解Servlet3.0异步请求

异步请求的基础概念 异步请求最直接的用法就是处理耗时业务,Http协议是单向的,只能客户端拉不能服务器主推. 异步请求的核心原理主要分为两大类:1.轮询.2长连接 轮询:就是定时获取返回结果. 长连接:客户端请求服务器后,连接不关闭,只有异步请求处理完成后才关闭连接. Servlet3.0对异步请求的支持   在Servlet3.0对异步请求的支持非常简单,只需要在请求的过程中调用re...

weixin_34043301的博客 249

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Servlet3.0——异步请求处理

在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理,当过来一个请求之后,会从tomcat的线程池中拿出一个线程去处理这个请求,处理完成之后再将该线程归还到线程池。但是线程池的数量是有限的,如果一个请求需要进行IO操作,比如访问数据库(或者调用第三方服务接口等),那么其所对应的线程将同步地等待IO操作...

如不來的博客 1798

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring注解驱动开发第56讲——详解Servlet 3.0异步请求

写在前面 前面呢,我们利用ServletContainerInitializer机制,并通过无配置文件的方式整合了Spring MVC,而且还知道了如何来个性化定制Spring MVC。而在本讲中,我们就来说一下Servlet 3.0给我们带来的又一个重要的特性,即异步请求处理。 Servlet 3.0的又一重要特性,即异步请求处理 在没有Servlet 3.0之前,我们请求处理的方式都是Thread-Per-Request,也就是说,每一个Http请求进来,我们都会给你开一个线程来从头到尾负责处理。如果用

李阿昀的博客 1352

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

59、servlet3.0-异步请求

59、servlet3.0-异步请求 59.1 开启servlet异步请求步骤 支持异步处理 asyncSupported=true 开启异步模式 req.startAsync(); 业务逻辑进行异步处理;开始异步处理 asyncContext.start() 获取响应 asyncContext.getResponse() 59.2 新建异步servlet处理类 @WebServle...

134

Servlet 3.0 的异步请求处理的原理和使用案例

详细介绍了Java Web 的Servlet3.0 中提供的异步请求处理机制的原理,并提供了使用案例!

终生学习践行者 4242

Java 异步响应servlet_Spring Boot实现异步请求(Servlet 3.0)

在spring 3.2 及以后版本中增加了对请求的异步处理,旨在提高请求的处理速度降低服务性能消耗。在我们的请求中做了耗时处理,当并发请求的情况下,为了避免web server的连接池被长期占用而引起性能问题,调用后生成一个非web的服务线程来处理,增加web服务器的吞吐量。为此 Servlet 3.0 新增了请求的异步处理,Spring 也在此基础上做了封装处理。本文还是以代码例子的方式说明如何...

weixin_31943449的博客 715

Servlet3.0新特性之异步请求实践

  1、为什么要使用异步Servlet?   非常适用于以下情况的Web应用程序   —— 长处理时间或者伪长处理时间 —— 等待资源释放——如数据库连接 —— 等待事件发生——如聊天消息 —— 等待缓慢服务的响应——如Web服务   释放当前请求处理以便处理其他请求 —— 为Web容器提供了更好的可伸缩性   浏览器将仍然显示为等待中 —— 用户体验没有改变   ...

hzylyl2402的专栏 234

servlet3.0 异步请求

servlet3.0异步请求的好处提高吞吐, 减少tomcat线程数量代码相关1.返回 Callable 来完成异步处理@RequestMapping(method=RequestMethod.POST) public Callable<String> processUpload(final MultipartFile file) { return new Callable<String>()

imduan的博客 411

springMVC+servlet3.0异步请求之AsyncContext

之前已经讲解过servlet3.0以下怎么实现异步请求,那就是使用jetty的continuation。下面来举例说明使用原生的servlet异步机制来进行异步请求。由于之前已经搭建了一个基于springmvc的框架,下面将会基于springmvc来讲解AsyncContext。先贴上代码,然后根据代码来体验异步流程package com.ds.test.asyncservlet;import ja

开心的专栏 9179

Servlet3.0异步请求监听器AsyncListener

sevlet3.0、AsyncListener、异步监听器、AsyncEvent

weixin_37862824的博客 1316

Servlet3.0中的异步请求

package com.itheima.async; import java.io.IOException; import javax.servlet.AsyncContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.an...

weixin_30537391的博客 91

Servlet 3.0笔记之异步请求相关方法和AsyncContext

startAsync

qq_41559763的博客 713

Day169.Servlet3.0_异步请求 -Spring注解驱动

Spring注解驱动 Servlet3.0_异步请求 一、原生的Servlet3.0异步请求 1、3.0之前的弊端 在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求。 即每一次Http请求都由某一个线程从头到尾负责处理 如果一个请求需要进行IO操作,比如访问数据库、调用第三方服务接口等,那么其所对应的线程将同步地等待IO操作完成, 而IO操作是非常慢的,所以此时的线程并不能及时地释放回线程池以供后续使用,在并发量越来越大的情况下,这将带来严重的性能问题。即便

阿昌爱Java 405

SpringBoot实践之---异步请求(Servlet 3.0)

原文地址: Spring Boot 异步请求(Servlet 3.0)在Spring 3.2 及以后版本中增加了对请求的异步处理,旨在提高请求的处理速度降低服务性能消耗。在我们的请求中做了耗时处理,当并发请求的情况下,为了避免web server的连接池被长期占用而引起性能问题,调用后生成一个非web的服务线程来处理,增加web服务器的吞吐量。为此 Servlet 3.0 新增了请求的异步处理,S...

luckykapok918的专栏 3733
上一篇: Servlet3.0整合Springmvc(注解版)
下一篇: Spring mvc异步处理
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值