返回顶部
首页 > 资讯 > 后端开发 > Python >servlet异步请求的实现
  • 564
分享到

servlet异步请求的实现

2024-04-02 19:04:59 564人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录1、什么是servlet异步请求2、Servlet异步请求示例2.1、示例准备2.2、实现自定义的Servlet2.3、异步任务2.4、测试场景1、什么是servlet异步请求

1、什么是servlet异步请求

Servlet 3.0 之前,一个普通 Servlet 的主要工作流程大致如下:

(1)、Servlet 接收到请求之后,可能需要对请求携带的数据进行一些预处理;

(2)、调用业务接口的某些方法,以完成业务处理;

(3)、根据处理的结果提交响应,Servlet 线程结束。

其中第二步处理业务逻辑时候很可以碰到比较耗时的任务,此时servlet主线程会阻塞等待完成业务处理,对于并发比较大的请求可能会产生性能瓶颈,则servlet3.0之后再此处做了调整,引入了异步的概念。

(1)、Servlet 接收到请求之后,可能需要对请求携带的数据进行一些预处理;

(2)、调用业务接口的某些方法过程中request.startAsync()请求,获取一个AsyncContext

(3)、紧接着servlet线程退出(回收到线程池),但是响应response对象仍旧保持打开状态,新增线程会使用AsyncContext处理并响应结果。

(4)、AsyncContext处理完成触发某些监听通知结果

2、Servlet异步请求示例

2.1、示例准备

本示例采用WEB.xml配置的形式,模拟场景为:笔者所在的it公司每周的工作内容,首先研发总监分配给产品、研发、测试相关的任务,布置完任务就出差(模拟请求响应),余下的各个小组进行自己任务操作(模拟的耗时操作),最终出周报完成任务(异步任务处理完成的通知)

git地址:https://GitHub.com/liushangzaibeijing/spsm.git  分支:dev_async

2.2、实现自定义的Servlet


//通过注解的形式开始异步
@WebServlet(urlPatterns = "*.async",asyncSupported = true)
public class AsyncServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       doPost(req,resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //开启异步支持
        //异步管理上下文
        resp.setCharacterEncoding("GBK");
        PrintWriter writer = resp.getWriter();
        writer.println("周工作任务布置开始");
        AsyncContext asyncContext = req.startAsync();
        asyncContext.start(new WeekTask(asyncContext));
        //添加监听器 处理完成监听
        asyncContext.addListener(new AsyncListener() {
            @Override
            public void onComplete(AsyncEvent asyncEvent) throws IOException {
                System.out.println("工作在"+new Date()+"处理完成");
            }
            @Override
            public void onTimeout(AsyncEvent asyncEvent) throws IOException {
                System.out.println("工作在"+new Date()+"处理超时");
            }
            @Override
            public void onError(AsyncEvent asyncEvent) throws IOException {
                System.out.println("工作在"+new Date()+"处理出错");
            }
            @Override
            public void onStartAsync(AsyncEvent asyncEvent) throws IOException {
                System.out.println("工作在"+new Date()+"处理开始");
            }
        });
        writer.println("周工作任务布置完成");
        writer.flush();
    }
}

  开启异步支持(默认异步支持不开启)有两种方式:

使用注解

web.xml配置

	<servlet>
		<servlet-name>asyncServlet</servlet-name>
		<servlet-class>com.xiu.async.servlet.AsyncServlet</servlet-class>
		<!-- 开启servlet的异步请求操作 -->
		<async-supported>true</async-supported>
	</servlet>
	<servlet-mapping>
		<servlet-name>asyncServlet</servlet-name>
		<url-pattern>*.async</url-pattern>
	</servlet-mapping>

上述代码中通过request.startAsync()启动异步处理 返回一个异步上下文对象AsyncContext最终是使用该上下文对象来进行异步业务逻辑处理,其中有两个核心方法 

asyncContext.start(new WeekTask(asyncContext));  添加一个异步任务该任务是一个Runnable线程接口,这里就清晰了其实是servlet线程将处理任务交给另一个子线程,servlet直接返回从而达到提高系统吞吐量的作用。
对于异步请求可以我们需要获取其中的结果,所有这里提供了监听器模式添加事件监听AsyncListener

onComplete异步请求处理完成触发 前提示需要调用 asyncContext.complete()方法(因为程序也不知道什么时候任务算是调用完毕了)
onTimeout异步请求处理超时触发,一般来说采用异步请求的任务都是比较耗时的任务,所以需要修改servlet默认的超时时间(修改的长一点)
onError异步处理错误的时候触发
onStartAsync异步处理开始的时候触发即为request.startAsync(),因为添加监听器在startAsync()方法后,所以第一个启动是无法触发该监听的

这里异步处理只是简单的打印了相关日志,不过真实的业务场景中可以写复杂的业务处理逻辑。

2.3、异步任务

这里提供相关的异步操作是实现runnable的线程实现类,同时这里提供了相关Job,PmJob(产品任务),RDJob(研发任务),TestJob(测试任务),每个任务模拟了10秒的耗时任务。


public class WeekTask implements Runnable {
 
    private List<Job> jobs = null;
 
    private AsyncContext asyncContext = null;
    //这里初始化产品任务PmJob、研发任务RDJob  测试任务TestJob
    public WeekTask(AsyncContext asyncContext) {
       this.asyncContext = asyncContext;
       jobs = new ArrayList<>();
       PmJob pmJob = new PmJob();
       RDJob rdJob = new RDJob();
       TestJob testJob = new TestJob();
       jobs.add(pmJob);
       jobs.add(rdJob);
       jobs.add(testJob);
    }
 
    @Override
    public void run() {
        for(Job job:jobs){
            job.execute();
        }
        System.out.println("周任务工作完成");
        //job执行完成后通知
      asyncContext.complete();
    }
}

  PmJob


public class PmJob implements Job {
    @Override
    public void execute() {
        System.out.println("产品经理开评审会议");
        try {
            Thread.sleep(10);
            System.out.println("模拟需求评审会议...");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

RDJob


public class RDJob implements Job {
    @Override
    public void execute() {
        System.out.println("程序猿开始开发");
        try {
            Thread.sleep(10);
            System.out.println("程序猿哼哧哼哧干活中...");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

TestJob


public class TestJob implements Job {
    @Override
    public void execute()  {
        System.out.println("测试开始测试");
        try {
            Thread.sleep(10);
            System.out.println("测试用例测试...");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

2.4、测试场景

请求立马响应,但是异步任务在后面处理

到此这篇关于servlet异步请求的实现的文章就介绍到这了,更多相关servlet异步请求内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: servlet异步请求的实现

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

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

猜你喜欢
  • servlet异步请求的实现
    目录1、什么是servlet异步请求2、Servlet异步请求示例2.1、示例准备2.2、实现自定义的Servlet2.3、异步任务2.4、测试场景1、什么是servlet异步请求 ...
    99+
    2024-04-02
  • Java Servlet异步请求开启的简单步骤
    目录1. 背景2. Servlet同步请求3. Servlet异步请求4. 异步Servlet使用方法5. Spring中的实现例子附:异步对象监听器总结1. 背景 在研究长轮询的实...
    99+
    2024-04-02
  • Java Servlet异步请求开启的示例分析
    这篇文章主要为大家展示了“Java Servlet异步请求开启的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java Servlet异步请求开启的示例分析”这篇文章...
    99+
    2023-06-29
  • Android HTTP网络请求的异步实现
    前言 大家都知道网络操作的响应时间是不定的,所有的网络操作都应该放在一个异步操作中处理,而且为了模块解耦,我们希望网络操作由专门的类来处理。所有网络数据发送,数据接收都有某几个...
    99+
    2022-06-06
    HTTP 异步 Android
  • golang 异步请求
    随着互联网的快速发展,越来越多的应用需要与外部服务交互,而这些服务所提供的 API 往往都是异步的。在单线程的程序中,同步请求往往会造成程序的堵塞,影响程序的性能和响应速度。因此,在异步请求方面,golang 这门语言的独特设计可以让我们更...
    99+
    2023-05-18
  • 如何实现ajax发送异步请求
    这篇文章将为大家详细讲解有关如何实现ajax发送异步请求,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下第一步(得到XMLHttpRequest)ajax其实只...
    99+
    2024-04-02
  • Ajax如何实现异步请求技术
    这篇文章将为大家详细讲解有关Ajax如何实现异步请求技术,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。AJAX的全称是Asynchronous JavaScript an...
    99+
    2024-04-02
  • ajax如何实现异步请求刷新
    这篇文章给大家分享的是有关ajax如何实现异步请求刷新的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在网站刷新的方法中,ajax刷新是一种用户体验良好的刷新方式,在结合ssh等流...
    99+
    2024-04-02
  • RocketMQ怎么实现请求异步处理
    这篇文章主要介绍“RocketMQ怎么实现请求异步处理”,在日常操作中,相信很多人在RocketMQ怎么实现请求异步处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”RocketMQ怎么实现请求异步处理”的疑...
    99+
    2023-06-19
  • react异步请求数据怎么实现
    在React中实现异步请求数据有多种方式,以下是其中几种常用的方法:1. 使用`fetch` API:`fetch`是现代浏览器提供...
    99+
    2023-09-13
    react
  • javascript请求servlet实现ajax的示例分析
    小编给大家分享一下javascript请求servlet实现ajax的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!aj...
    99+
    2024-04-02
  • 异步请求如何利用Spring Boot来实现
    这篇文章给大家介绍异步请求如何利用Spring Boot来实现,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首先说一下几个要点: @WebFilter 和 @WebServlet 注解中的 asyncSupp...
    99+
    2023-05-31
    springboot 异步请求
  • nodejs 异步网络请求
    Node.js是一个基于Chrome V8引擎构建的JavaScript运行时环境,可以在服务器端使用JavaScript编写程序,支持异步I/O操作,适合于构建高并发、低延迟的网络应用程序。在使用Node.js开发网络应用程序时,使用异步...
    99+
    2023-05-18
  • 小程序异步请求怎么改为同步请求
    小程序的网络请求默认是异步请求,无法直接改为同步请求。但是可以使用ES6的async/await来实现类似同步的效果。1. 在异步请...
    99+
    2023-10-20
    小程序
  • uniapp网络请求异步同步
    在移动应用开发中,网络请求是常见的一项要求。uniapp作为一个跨平台开发框架,提供了网络请求的API,使得开发者能够方便地完成网络请求的操作。在网络请求中,异步和同步是两种不同的方式,下面将为大家介绍uniapp网络请求的异步和同步方式。...
    99+
    2023-05-22
  • Spring中注解方式的异步请求如何实现
    小编给大家分享一下Spring中注解方式的异步请求如何实现,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、Servlet3.0异步请求@WebServlet(value = "/async&...
    99+
    2023-06-15
  • springboot如何实现异步响应请求(前端请求超时的问题解决)
    目录问题解决方案1.服务端异步处理2.设置响应时间需要避免踩到的坑1.关于dubbo中的设置2.关于tomcat的设置3.关于Nginx的设置总结问题 实际场景中会遇到请求业务处理流...
    99+
    2023-01-30
    springboot 异步响应请求 springboot异步请求处理 springboot异步接口响应
  • Android实现图片异步请求加三级缓存
    使用xUtils等框架是很方便,但今天要用代码实现bitmapUtils 的功能,很简单, AsyncTask请求一张图片 ####AsyncTask #####AsyncT...
    99+
    2022-06-06
    异步请求 三级缓存 图片 异步 缓存 Android
  • Vuejs2.0中怎么实现一个异步跨域请求
    Vuejs2.0中怎么实现一个异步跨域请求,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先我们来安装Vue-Cli开发模板(这个模板可以...
    99+
    2024-04-02
  • Java 异步编程教程:如何在http请求中实现异步编程?
    随着互联网技术的不断发展,越来越多的应用需要处理大量的网络请求。而在高并发场景下,同步的网络请求会导致线程阻塞,从而降低应用的性能。因此,采用异步编程模式可以有效地提高应用的性能和并发能力。本文将为你介绍如何在Java中实现异步编程,并通...
    99+
    2023-06-25
    异步编程 教程 http
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作