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