一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java SpringMVC異步處理詳解

Java SpringMVC異步處理詳解

2022-03-01 11:51路人甲Java Java教程

這篇文章主要介紹了Java springmvc的處理異步,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

1、本篇內容

本文讓大家掌握 springmvc 中異步處理請求,特別牛逼的一個功能,大家一定要掌握。

 

2、看段代碼. 分析問題

@ResponseBody
@RequestMapping("/async/m1.do")
public String m1() throws InterruptedException {
  long st = System.currentTimeMillis();
  System.out.println("主線程:" + Thread.currentThread() + "," + st + ",開始");
  //休眠3秒,模擬耗時的業務操作
  TimeUnit.SECONDS.sleep(3);
  long et = System.currentTimeMillis();
  System.out.println("主線程:" + Thread.currentThread() + "," + st + ",結束,耗時(ms):" + (et - st));
  return "ok";
}

這段代碼很簡單

這段代碼是 springmvc 提供的一個接口

內部休眠了 3 秒鐘,用來模擬耗時的操作

方法內部有 2 條日志(日志中包含了當前線程、開始時間、結束時間、耗時)

瀏覽器中訪問下這個接口,效果如下,可以看到接口耗時 3s 左右。

Java SpringMVC異步處理詳解

控制臺輸出

主線程:Thread[http-nio-8080-exec-1,5,main],1624889293055,開始
主線程:Thread[http-nio-8080-exec-1,5,main],1624889293055,結束,耗時(ms):3002

從輸出中,我們可以看出,這個接口從開始到結束都是由 tomcat 中的線程來處理用戶請求的,也就是說,3 秒這段時間內,tomcat 中的一個線程會被當前請求一直占用了則,tomcat 線程是有最大值的,默認情況下好像是 75,那么問題來了。

當 3 秒之內,來的請求數量超過了 tomcat 最大線程數的時候,其他請求就無法處理了,而此時 tomcat 中這些線程都處理 sleep 3s 的休眠狀態,cpu 此時沒活干,此時就會造成機器沒活干,但是呢又不能處理新的請求,這就是坑啊,浪費資源,怎么辦呢?

遇到這種場景的,也就是說接口內部比價耗時,但是又不能充分利用 cpu 的,我們可以采用異步的方式來處理請求,過程如下:

tomcat 線程,將請求轉發給我們自定義的子線程去處理這個請求,然后 tomcat 就可以繼續去接受新的請求了。

Java SpringMVC異步處理詳解

 

3、springmvc 中異步處理

主要有 3 個大的步驟。

step1:servlet 開啟異步處理支持

web.xml 中開啟 servlet 異步支持

Java SpringMVC異步處理詳解

step2:Filter 中添加異步支持

如果我們的異步請求需要經過 Filter 的,那么需要在 web.xml 對這個 Filter 添加異步支持.

Java SpringMVC異步處理詳解

step3:接口返回值為 DeferredResult

這個步驟中細節比較多,當需要異步響應請求的時候,返回值需要為 DeferredResult,具體參考下面案例代碼,詳細信息都在注釋中了,大家注意看注釋。

第 1 步:創建 DeferredResult<返回值類型>(超時時間[毫秒],超時回調的代碼)

第 2 步:在子線程中異步處理業務,調用 DeferredResult 的 setResult 方法,設置最終返回到客戶端的結果,此方法調用以后,客戶端將接收到返回值,然后響應過程請求就結束了

第 3 步:將 DefaultResult 作為方法返回值

/**
* 使用springmvc的異步功能,業務處理放在異步線程中執行
*
* @param timeout 異步處理超時時間(毫秒)
* @return
*/
@ResponseBody
@RequestMapping("/async/m2/{timeout}.do")
public DeferredResult m2(@PathVariable("timeout") long timeout) {
  long st = System.currentTimeMillis();
  System.out.println("主線程:" + Thread.currentThread() + "," + st + ",開始");
  /**
   * 1、創建DeferredResult<返回值類型>(超時時間[毫秒],超時回調的代碼)
   */
  DeferredResult result = new DeferredResult(timeout, () -> {
      System.out.println("超時了");
      return "timeout";
  });
  //2、異步處理業務,
  new Thread(() -> {
      //開啟一個異步線程,在異步線程中進行業務處理操作
      try {
          TimeUnit.SECONDS.sleep(3);
          //3、調用DeferredResult的setResult方法,設置最終返回到客戶端的結果,此方法調用以后,客戶端將接收到返回值
          result.setResult("ok");
      } catch (InterruptedException e) {
          result.setResult("發生異常了:" + e.getMessage());
      }
  }).start();
  long et = System.currentTimeMillis();
  System.out.println("主線程:" + Thread.currentThread() + "," + st + ",結束,耗時(ms):" + (et - st));
  //3、將DefaultResult作為方法返回值
  return result;
}

上面的 m2 方法個 timeout 參數,調用者通過這個參數來指定接口的超時時間,未超時的情況下,也就是說 timeout 大于 3 秒的時候,此時會輸出 ok,否則將出現超時,此時會將 DeferredResult 構造器第 2 個參數的執行結果作為最終的響應結果,即會向客戶端輸出 timeout。

使用建議:案例開啟了一個新的子線程來執行業務操作,生產環境中,建議大家采用線程池的方式,效率更高。

下面我們來通過 2 個 case 來模擬下這個接口超時和正常的結果。

 

4、模擬非超時請求

當 timeout 大于 3 秒時,才不會出現超時,此時我們傳遞 4000 毫秒來試試

Java SpringMVC異步處理詳解

控制臺輸出如下,可以看到主線程瞬間就結束了。

主線程:Thread[http-nio-8080-exec-6,5,main],1624891886020,開始
主線程:Thread[http-nio-8080-exec-6,5,main],1624891886020,結束,耗時(ms):0

 

5、模擬超時請求

當 timeout 小于 3 秒會出現超時,此時我們傳遞 1000 毫秒來試試

Java SpringMVC異步處理詳解

控制臺輸出如下,輸出了超時信息,且通過前兩行輸出看出主線程瞬間就結束了,不會被請求阻塞。

主線程:Thread[http-nio-8080-exec-1,5,main],1624892109695,開始
主線程:Thread[http-nio-8080-exec-1,5,main],1624892109695,結束,耗時(ms):0
超時了

 

6、總結

當接口中有大量的耗時的操作,且這些耗時的操作讓線程處于等待狀態時,此時為了提升系統的性能,可以將接口調整為異步處理的方式。

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://blog.csdn.net/likun557/article/details/119066603

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: xxxxx大片在线观看 | 青青草影院在线观看 | 亚洲欧美午夜 | 60岁妇女毛片免费观看 | 好男人在线观看免费高清2019韩剧 | 调教开发新婚娇妻放荡 | 欧美精品v欧洲高清 | 99热这里有精品 | 欧美激情亚洲 | jizz漫画| 美女无遮挡 | 男人狂躁女人下面的视频免费 | 全肉一女n男np高h双龙养成 | 成人欧美一区二区三区黑人 | www.羞羞答答 | 臀精插宫NP文| 九九精品热 | 2021日本三级理论影院 | 天天看黄 | 精品人伦一区二区三区潘金莲 | 女人被爽到呻吟娇喘的视频动态图 | 91影视永久福利免费观看 | 欧美日韩色图 | 色哟哟在线资源 | 国产精品成人自拍 | 欧美日韩国产手机在线观看视频 | 毛片视频网站在线观看 | 热久久天天拍天天拍热久久2018 | 四虎在线永久视频观看 | 秋霞宅宅236理论片 秋霞一级黄色片 | 亚洲福利一区二区三区 | 精品国产一区二区三区久久久狼 | 天天射天天舔 | 久久久这里有精品999 | 免费超级乱淫播放手机版 | 国产激情视频在线 | 成品人视频免费观看 | 欧美视频黑鬼大战白妞 | 四虎网站在线 | 高清黄色直接看 | 国语刺激对白勾搭视频在线观看 |