SpringMVC异步处理(Callable)

2023-01-18 21:16:15

1.使用业务场景:

对于有的请求业务处理流程可能比较耗时,比如长查询,远程调用等,主线程会被一直占用,而tomcat线程池线程有限,处理量就会下降

servlet3.0以后提供了对异步处理的支持,springmvc封装了异步处理,满足用户请求后,主线程很快结束,并开启其它线程处理任务,并将处理结果响应用户,而主线程就可以接收更多请求。

参考官方解释:

https://spring.io/blog/2012/05/07/spring-mvc-3-2-preview-introducing-servlet-3-async-support

原理简介:

对于一次请求,比如front/test

1,springmvc开启副线程处理业务(将Callable 提交到 TaskExecutor)

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

3,Callable返回结果,SpringMVC将请求front/test重新派发给容器(再重新请求一次front/test),恢复之前的处理;

4,DispatcherServlet重新被调用,将结果返回给用户

代码演示

1.这是普通的调用,我这里加了一个方法执行的时间 ,基于Rest风格的远程调用 

  @RequestMapping("/test")
    public String test(){
        long startTime = System.currentTimeMillis();    //获取开始时间
        String t=testInterface.test();   //远程服务调用
        long endTime = System.currentTimeMillis();    //获取结束时间
        System.out.println("test程序运行时间:" + (endTime - startTime) + "ms");    //输出程            序运行时间
        return t;
    }

执行时间: 297ms

2.基于Callabe的调用


    @RequestMapping("/test2")
    public Callable<String> test2(){
        Callable<String> callable= new Callable<String>() {
            @Override
            public String call() throws Exception {
                long startTime = System.currentTimeMillis();    //获取开始时间
                String t=testInterface.test();   //远程服务调用
                long endTime = System.currentTimeMillis();    //获取结束时间
                System.out.println("test2程序运行时间:" + (endTime - startTime) + "ms");    //输出程序运行时间
                return t;
            }
        };
        return callable;
    }

执行时间:7ms

通过执行时间的对比,我们可以得出异步处理对 比如长查询,远程调用等,有一定提高系统的效率以及提高吞吐量,从而实现高并发

  • 作者:Niko2009
  • 原文链接:https://blog.csdn.net/weixin_42407151/article/details/93200512
    更新时间:2023-01-18 21:16:15