SpringMVC異步處理(Callable)

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

通過執行時間的對比,我們可以得出異步處理對 比如長查詢,遠程調用等,有一定提高系統的效率以及提高吞吐量,從而實現高併發

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章