返回顶部
首页 > 资讯 > 精选 >Spring中注解方式的异步请求如何实现
  • 789
分享到

Spring中注解方式的异步请求如何实现

2023-06-15 08:06:13 789人浏览 薄情痞子
摘要

小编给大家分享一下spring中注解方式的异步请求如何实现,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、Servlet3.0异步请求@WEBServlet(value = "/async&

小编给大家分享一下spring中注解方式的异步请求如何实现,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

一、Servlet3.0异步请求

@WEBServlet(value = "/async", asyncSupported = true)public class HelloAsyncServlet extends httpservlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        //1、设置支持异步处理asyncSupported = true        //2、开启异步模式        System.out.println("主线程开始:" + Thread.currentThread() + "==>" + System.currentTimeMillis());        AsyncContext startAsync = req.startAsync();        //3、业务逻辑进行异步处理,开始异步处理        startAsync.start(new Runnable() {            @Override            public void run() {                try {                    System.out.println("副线程开始:" + Thread.currentThread() + "==>" + System.currentTimeMillis());                    sayHello();                    //获取到异步的上下文                    AsyncContext asyncContext = req.getAsyncContext();                    startAsync.complete();                    ServletResponse response = asyncContext.getResponse();                    response.getWriter().write("hello async!");                    System.out.println("副线程结束:" + Thread.currentThread() + "==>" + System.currentTimeMillis());                } catch (Exception e) {                    e.printStackTrace();                }            }        });        System.out.println("主线程结束:" + Thread.currentThread() + "==>" + System.currentTimeMillis());    }    public void sayHello() throws Exception {        System.out.println(Thread.currentThread() + "processing...");        Thread.sleep(3000);    }}

打印结果:

Spring中注解方式的异步请求如何实现

二、springMVC的异步请求

返回Callable

@Controllerpublic class AsyncController {    @ResponseBody    @RequestMapping("/async01")    public Callable<String> async01(){        System.out.println("主线程开始:" + Thread.currentThread() + "==>" + System.currentTimeMillis());        Callable<String> callable = new Callable<String>() {            public String call() throws Exception {                System.out.println("副线程开始:" + Thread.currentThread() + "==>" + System.currentTimeMillis());                Thread.sleep(2000);                System.out.println("副线程开始:" + Thread.currentThread() + "==>" + System.currentTimeMillis());                return "async01";            }        };        System.out.println("主线程结束:" + Thread.currentThread() + "==>" + System.currentTimeMillis());        return callable;    }}
  • 控制器返回Callable

  • Spring进行异步处理,将Callable提交给TaskExecutor,使用一个隔离的线程进行执行

  • DispatcherServlet和所有的Filter退出Web容器的线程,但是response保持打开状态

  • Callable返回结果,Spreingmvc将请求重新派发给容器,恢复之前的处理,Callable返回值就是目标方法的返回值

  • 根据Callable返回的结果,SpringMVC继续进行视图渲染流程等(从收到请求到视图渲染)

输出结果:

Spring中注解方式的异步请求如何实现

返回DeferredResult

模拟一个消息中间件

public class DeferredResultQueue {    private static Queue<DeferredResult<Object>> queue = new ConcurrentLinkedDeque<DeferredResult<Object>>();        public static void save(DeferredResult<Object> deferredResult){        queue.add(deferredResult);    }        public static DeferredResult<Object> get(){        return queue.poll();    }}

/createOrder请求会暂时保存DeferredResultQueue中,/create请求会获取DeferredResultQueue中的请求,进行业务逻辑的处理并返回结果

@Controllerpublic class AsyncController {    @ResponseBody    @RequestMapping("/createOrder")    public DeferredResult<Object> createOrder(){        DeferredResult<Object> deferredResult = new DeferredResult<Object>((long)3000,"create fail");        DeferredResultQueue.save(deferredResult);        return deferredResult;    }    @ResponseBody    @RequestMapping("/create")    public String create(){        String order = UUID.randomUUID().toString();        DeferredResult<Object> deferredResult = DeferredResultQueue.get();        deferredResult.setResult(order);        return "success:" + order;    }}

看完了这篇文章,相信你对“Spring中注解方式的异步请求如何实现”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: Spring中注解方式的异步请求如何实现

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

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

猜你喜欢
  • Spring中注解方式的异步请求如何实现
    小编给大家分享一下Spring中注解方式的异步请求如何实现,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、Servlet3.0异步请求@WebServlet(value = "/async&...
    99+
    2023-06-15
  • Spring中注解方式的异步请求
    一、Servlet3.0异步请求 @WebServlet(value = "/async", asyncSupported = true) public class HelloA...
    99+
    2024-04-02
  • 异步请求如何利用Spring Boot来实现
    这篇文章给大家介绍异步请求如何利用Spring Boot来实现,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首先说一下几个要点: @WebFilter 和 @WebServlet 注解中的 asyncSupp...
    99+
    2023-05-31
    springboot 异步请求
  • servlet异步请求的实现
    目录1、什么是servlet异步请求2、Servlet异步请求示例2.1、示例准备2.2、实现自定义的Servlet2.3、异步任务2.4、测试场景1、什么是servlet异步请求 ...
    99+
    2024-04-02
  • 如何实现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
  • Java中Servelt3异步请求方式是什么
    本篇内容介绍了“Java中Servelt3异步请求方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!用同步请求模型,所有动作都交给同一...
    99+
    2023-06-16
  • springboot如何实现异步响应请求(前端请求超时的问题解决)
    目录问题解决方案1.服务端异步处理2.设置响应时间需要避免踩到的坑1.关于dubbo中的设置2.关于tomcat的设置3.关于Nginx的设置总结问题 实际场景中会遇到请求业务处理流...
    99+
    2023-01-30
    springboot 异步响应请求 springboot异步请求处理 springboot异步接口响应
  • Java 异步编程教程:如何在http请求中实现异步编程?
    随着互联网技术的不断发展,越来越多的应用需要处理大量的网络请求。而在高并发场景下,同步的网络请求会导致线程阻塞,从而降低应用的性能。因此,采用异步编程模式可以有效地提高应用的性能和并发能力。本文将为你介绍如何在Java中实现异步编程,并通...
    99+
    2023-06-25
    异步编程 教程 http
  • vue中如何进行异步请求
    目录如何进行异步请求一、axios实现异步请求二、vue-resource实现异步请求(和axios步骤基本相同)vue接口异步请求其他方法如何进行异步请求 一、axios实现异步请...
    99+
    2024-04-02
  • springboot @Async 注解如何实现方法异步
    目录@Async注解如何实现方法异步一、springboot的App类需要的注解二、service层的注解三、调用层异步注解@Async的使用以及注意事项第一步开启异步下面显示配置线...
    99+
    2024-04-02
  • SpringMVC环境下如何实现的Ajax异步请求JSON格式数据
    小编给大家分享一下SpringMVC环境下如何实现的Ajax异步请求JSON格式数据,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧...
    99+
    2024-04-02
  • Android HTTP网络请求的异步实现
    前言 大家都知道网络操作的响应时间是不定的,所有的网络操作都应该放在一个异步操作中处理,而且为了模块解耦,我们希望网络操作由专门的类来处理。所有网络数据发送,数据接收都有某几个...
    99+
    2022-06-06
    HTTP 异步 Android
  • jQuery中异步get请求如何使用
    本文小编为大家详细介绍“jQuery中异步get请求如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“jQuery中异步get请求如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、什么是异步请求在传...
    99+
    2023-07-05
  • Spring中的Http请求如何使用restTemplete实现
    这篇文章给大家介绍Spring中的Http请求如何使用restTemplete实现,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。使用Spring的restTemplete进行Http请求public class Res...
    99+
    2023-05-31
    resttemplete spring http请求
  • Vue3中如何使用异步请求示例详解
    目录1、前言2、快速开始2.1、思路2.2、安装&封装axios2.3、设计接口2.4、设计视图2.5、最终效果总结1、前言 接上节,我们初步体验了layui-vue的用法。...
    99+
    2024-04-02
  • SpringBoot中如何使用@RestController注解实现http请求
    本篇内容主要讲解“SpringBoot中如何使用@RestController注解实现http请求”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot中如何使用@RestContr...
    99+
    2023-06-08
  • spring retry实现方法请求重试的使用步骤
    目录1 spring-retry是什么?2 使用步骤2.1 引入maven库2.2 在spring启动类上开启重试功能2.3 公共业务代码2.4 传统的重试做法2.5 使用sprin...
    99+
    2024-04-02
  • AJAX中请求方式以及同步异步有什么区别
    这篇文章主要介绍AJAX中请求方式以及同步异步有什么区别,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 请求方式,分为GET与POST: GET 最为常...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作