Java Servlet异步请求开启的简单步骤

目录
  • 1. 背景
  • 2. Servlet同步请求
  • 3. Servlet异步请求
  • 4. 异步Servlet使用方法
  • 5. Spring中的实现例子
  • 附:异步对象监听器
  • 总结

1. 背景

在研究长轮询的实现过程,有使用到Servlet3的异步请求。下面就来学习一下Servlet3的异步请求

现在Servlet的版本已经到了5

2. Servlet同步请求

以Tomcat服务器为例:

  • Http请求到达Tomcat
  • Tomcat从线程池中取出线程处理到达Tomcat的请求
  • 将请求Http解析为HttpServletRequest
  • 分发到具体Servlet处理对应的业务
  • 通过HttpServletResponse返回处理的数据

正常情况下请求模型和上面的模型一样,所有的请求交给Tomcat服务器的线程池处理,整个动作处理完成才释放回线程池。
这里就存在了一个问题如果后期的业务处理时间比较长。那么处理请求的线程就会被一直占用。当请求越来越多被占用的线程也会越来越多。直到被耗尽线程池中所有的线程。后续进来的就一直被阻塞等待线程来处理。

当用户不关心提交的返回可以定义业务处理线程池,前端请求提交后,Tomcat线程将处理提交给业务线程池立即返回。Spring 中的异步任务(@Async)就是这样的。

3. Servlet异步请求

同样以Tomcat服务为例:

  • 将请求Http解析为HttpServletRequest
  • 分发到具体Servlet处理,将业务提交给自定义业务线程池,Tomcat线程立刻被释放。
  • 当业务线程将任务执行结束,将会将结果转交给Tomcat线程池。
  • 通过HttpServletResponse返回处理的数据

引入异步Servlet3整体流程:

使用异步 Servelt,Tomcat 线程仅仅处理请求解析动作,所有耗时较长的业务操作全部交给业务线程池,所以相比同步请求, Tomcat 线程可以处理 更多请求。虽然将业务交给了业务流程处理,但是前端还在等待结果返回(同步等待返回)。

异步处理,前端会同步等待结果返回。很多人会觉得异步请求会返回更快。其实不然由于异步存在线程的切换。所有返回时间会比同步的慢。

虽然没有降低相应时间但是还是有其他明显的优点:

  • 可以处理更高并发连接数,提高系统整体吞吐量
  • 请求解析与业务处理完全分离,职责单一
  • 自定义业务线程池,我们可以更容易对其监控,降级等处理
  • 可以根据不同业务,自定义不同线程池,相互隔离,不用互相影响

4. 异步Servlet使用方法

使用异步Servlet只需要三步:

  • HttpServletRequest#startAsync() 获取 AsyncContext 异步上下文
  • 使用自定义业务线程池处理业务
  • AsyncContext#getResponse() 返回处理结果给前端,然后调用 AsyncContext#complete()

5. Spring中的实现例子

代码如下图:

  • 开启异步Servlet
  • 模拟业务执行
  • 返回结果给前端

前面有说过前端是一直在同步等待的我们通过运行代码来验证一下。结果如下图:

代码地址: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 Servlet异步请求开启的文章就介绍到这了,更多相关Servlet异步请求开启内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring-MVC异步请求之Servlet异步处理

    在Servlet3.0的规范中新增了对异步请求的支持,SpringMVC又在此基础上对异步请求提供了方便. 异步请求是在处理比较耗时的业务时先将request返回,然后另起线程处理耗时的业务,处理完后在返回给用户. 异步请求可以给我们带来很多方便,最直接的用法就是处理耗时的业务,比如,需要查询数据库,需要调用别的服务器来处理等情况下可以先将请求返回给客户端,然后启用新线程处理耗时业务. 如果我们合适的扩展可以实现订阅者模式的消息订阅功能,比如,当有异常情况发生时可以主动将相关信息发送给运维人员,

  • Spring Boot实现异步请求(Servlet 3.0)

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

  • Java Servlet异步请求开启的简单步骤

    目录 1. 背景 2. Servlet同步请求 3. Servlet异步请求 4. 异步Servlet使用方法 5. Spring中的实现例子 附:异步对象监听器 总结 1. 背景 在研究长轮询的实现过程,有使用到Servlet3的异步请求.下面就来学习一下Servlet3的异步请求 现在Servlet的版本已经到了5 2. Servlet同步请求 以Tomcat服务器为例: Http请求到达Tomcat Tomcat从线程池中取出线程处理到达Tomcat的请求 将请求Http解析为HttpSe

  • Ajax异步请求的五个步骤及实战案例

    目录 前言 1.建立xmlHttpRequest异步对象 2.创建HTTP请求(设置请求方法和URL) 3.发送数据 4.设置回调函数 5.在回调函数中对不同的响应状态进行处理 案例实现 总结 前言 AJAX(Asynchronous JavaScript and XML):是指一种创建交互式网页应用的网页开发技术,通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这就意味着可以在不重新加载整个网页的情况下,对网页的局部进行更新. 1.建立xmlHttpRequest异步对象

  • vue中如何进行异步请求

    目录 如何进行异步请求 一.axios实现异步请求 二.vue-resource实现异步请求(和axios步骤基本相同) vue接口异步请求 其他方法 如何进行异步请求 一.axios实现异步请求 1.项目中安装axiox npm install --save axios 2.在main.js中引入以供全局使用 import axios from 'axios' //可以给axios的ajax请求设置统一的主机和端口号 axios.defaults.baseURL = "http://157.1

  • JAVA实现异步调用实例代码

    在JAVA平台,实现异步调用的角色有如下三个角色: 调用者 取货凭证   真实数据 一个调用者在调用耗时操作,不能立即返回数据时,先返回一个取货凭证.然后在过一断时间后凭取货凭证来获取真正的数据. 在调用一个方法的时候,程序会进入被调用方法体内,执行完这个被调用方法后,才返回执行下一条语句.怎么做到像ajax异步请求一样,发送请求后,没等请求响应就执行下一条语句呢?对于java的异步请求,找了许多教材都没有找到,如thinking in java.core java2 ......等等.受多线程

  • jquery请求servlet实现ajax异步请求的示例

    ajax可以发送异步请求实现无刷新效果,但是使用javascript比较麻烦,就query提供了一些封装的方法 ,可以使得操作更为简单: $.ajax()方法: function sendRequest() { $.ajax({ url: "Hello", type: "GET", dataType: "txt", data: "name=zhangsan", complete: function(result){ alert

  • AJAX实现简单的注册页面异步请求实例代码

    AJAX简介 (1)AJAX = 异步 JavaScript 和 XML. (2)AJAX 是一种用于创建快速动态网页的技术. (3)通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. (4)传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面.  简单布局 JS先判断,把前端可以的判断做,减少服务器的交互 $('button').on('click',function(){; var boolu

  • java发送http请求并获取状态码的简单实例

    目前做项目中有一个需求是这样的,需要通过java发送url请求,查看该url是否有效,这时我们可以通过获取状态码来判断. try { URL u = new URL("http://10.1.2.8:8080/fqz/page/qizha/pros_add.jsp"); try { HttpURLConnection uConnection = (HttpURLConnection) u.openConnection(); try { uConnection.connect(); Sy

  • java实现HttpClient异步请求资源的方法

    本文实例讲述了java实现HttpClient异步请求资源的方法.分享给大家供大家参考.具体实现方法如下: package demo; import java.util.concurrent.CountDownLatch; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.nio.client.DefaultHttpAsyn

随机推荐