Spring中注解方式的异步请求

 更新时间:2021年06月03日 17:27:45   作者:煎丶包  
今天给大家整理了Spring中注解方式的异步请求的知识点,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下

一、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);
    }
}

打印结果:

在这里插入图片描述

二、SpringMVC的异步请求

返回Callable

@Controller
public 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继续进行视图渲染流程等(从收到请求到视图渲染)

输出结果:

在这里插入图片描述

返回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中的请求,进行业务逻辑的处理并返回结果

@Controller
public 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中注解方式的异步请求的文章就介绍到这了,更多相关注解方式的异步请求内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于spring实现websocket实时推送实例

    基于spring实现websocket实时推送实例

    这篇文章主要为大家详细介绍了基于spring实现websocket实时推送实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数示例代码

    Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数示例代码

    这篇文章主要介绍了Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数Demo,本文给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
    2018-01-01
  • java中Arthas的作用和使用方式

    java中Arthas的作用和使用方式

    Arthas 是由阿里巴巴开源的 Java 诊断工具,主要用于在生产环境中诊断和解决 Java 应用问题,它提供实时监控、类信息查看、动态追踪、条件表达式断点等功能,支持非侵入式设计和高扩展性,通过 Arthas,开发者可以在不停止应用的情况下,快速定位和解决问题
    2025-01-01
  • 阿里Druid数据连接池引发的线上异常解决

    阿里Druid数据连接池引发的线上异常解决

    这篇文章主要为大家介绍了一次关于阿里Druid数据连接池引发的线上异常问题的解决方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • Java SpringBoot在RequestBody中高效的使用枚举参数原理案例详解

    Java SpringBoot在RequestBody中高效的使用枚举参数原理案例详解

    这篇文章主要介绍了Java SpringBoot在RequestBody中高效的使用枚举参数原理案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • 详谈锁和监视器之间的区别_Java并发

    详谈锁和监视器之间的区别_Java并发

    下面小编就为大家带来一篇详谈锁和监视器之间的区别_Java并发。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Springcloud GateWay网关配置过程图解

    Springcloud GateWay网关配置过程图解

    这篇文章主要介绍了Springcloud GateWay网关配置过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • Java基础总结之Thymeleaf详解

    Java基础总结之Thymeleaf详解

    Thymeleaf是一种现代的基于服务器端的Java模板引擎技术,也是一个优秀的面向Java的XML、XHTML、HTML5页面模板,它具有丰富的标签语言、函数和表达式,在使用Spring Boot框架进行页面设计时,一般会选择Thymeleaf模板,需要的朋友可以参考下
    2021-05-05
  • java冒泡排序和选择排序详解

    java冒泡排序和选择排序详解

    这篇文章主要介绍了java数组算法例题代码详解(冒泡排序,选择排序),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • JPA 查询原生SQL转换VO对象方式

    JPA 查询原生SQL转换VO对象方式

    这篇文章主要介绍了JPA 查询原生SQL转换VO对象方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论