91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java?Servlet異步請求開啟的示例分析

發布時間:2022-03-04 09:52:11 來源:億速云 閱讀:156 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“Java Servlet異步請求開啟的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Java Servlet異步請求開啟的示例分析”這篇文章吧。

1. 背景

在研究長輪詢的實現過程,有使用到Servlet3的異步請求。

2. Servlet同步請求

以Tomcat服務器為例:

  • Http請求到達Tomcat

  • Tomcat從線程池中取出線程處理到達Tomcat的請求

  • 將請求Http解析為HttpServletRequest

  • 分發到具體Servlet處理對應的業務

  • 通過HttpServletResponse返回處理的數據

Java?Servlet異步請求開啟的示例分析

正常情況下請求模型和上面的模型一樣,所有的請求交給Tomcat服務器的線程池處理,整個動作處理完成才釋放回線程池。
這里就存在了一個問題如果后期的業務處理時間比較長。那么處理請求的線程就會被一直占用。當請求越來越多被占用的線程也會越來越多。直到被耗盡線程池中所有的線程。后續進來的就一直被阻塞等待線程來處理。

當用戶不關心提交的返回可以定義業務處理線程池,前端請求提交后,Tomcat線程將處理提交給業務線程池立即返回。Spring 中的異步任務(@Async)就是這樣的。

3. Servlet異步請求

同樣以Tomcat服務為例:

  • 將請求Http解析為HttpServletRequest

  • 分發到具體Servlet處理,將業務提交給自定義業務線程池,Tomcat線程立刻被釋放。

  • 當業務線程將任務執行結束,將會將結果轉交給Tomcat線程池。

  • 通過HttpServletResponse返回處理的數據

引入異步Servlet3整體流程:

Java?Servlet異步請求開啟的示例分析

使用異步 Servelt,Tomcat 線程僅僅處理請求解析動作,所有耗時較長的業務操作全部交給業務線程池,所以相比同步請求, Tomcat 線程可以處理 更多請求。雖然將業務交給了業務流程處理,但是前端還在等待結果返回(同步等待返回)。

異步處理,前端會同步等待結果返回。很多人會覺得異步請求會返回更快。其實不然由于異步存在線程的切換。所有返回時間會比同步的慢。

雖然沒有降低相應時間但是還是有其他明顯的優點:

  • 可以處理更高并發連接數,提高系統整體吞吐量

  • 請求解析與業務處理完全分離,職責單一

  • 自定義業務線程池,我們可以更容易對其監控,降級等處理

  • 可以根據不同業務,自定義不同線程池,相互隔離,不用互相影響

4. 異步Servlet使用方法

使用異步Servlet只需要三步:

  • HttpServletRequest#startAsync() 獲取 AsyncContext 異步上下文

  • 使用自定義業務線程池處理業務

  • AsyncContext#getResponse() 返回處理結果給前端,然后調用 AsyncContext#complete()

5. Spring中的實現例子

代碼如下圖:

Java?Servlet異步請求開啟的示例分析

  • 開啟異步Servlet

  • 模擬業務執行

  • 返回結果給前端

前面有說過前端是一直在同步等待的我們通過運行代碼來驗證一下。結果如下圖:

Java?Servlet異步請求開啟的示例分析

代碼地址:github.com/mxsm/spring…

附:異步對象監聽器

在異步對象完成、超時、錯誤或者開始時監聽

        //獲取異步上下文對象
        AsyncContext ac=req.startAsync();
        ac.addListener(new AsyncListener() {
            @Override
            public void onComplete(AsyncEvent asyncEvent) throws IOException {
                
            }

            @Override
            public void onTimeout(AsyncEvent asyncEvent) throws IOException {

            }

            @Override
            public void onError(AsyncEvent asyncEvent) throws IOException {

            }

            @Override
            public void onStartAsync(AsyncEvent asyncEvent) throws IOException {

            }
        });

以上是“Java Servlet異步請求開啟的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

台中市| 乌鲁木齐市| 新安县| 十堰市| 三江| 平昌县| 平果县| 东安县| 新安县| 法库县| 清原| 赫章县| 乌拉特前旗| 平湖市| 甘南县| 陆良县| 杭锦后旗| 北宁市| 蒙阴县| 藁城市| 安图县| 会昌县| 固镇县| 衡阳市| 广安市| 永宁县| 九龙县| 五峰| 延津县| 韶关市| 深州市| 抚宁县| 喜德县| 南宫市| 云阳县| 盐津县| 沙雅县| 荣昌县| 东乌珠穆沁旗| 巴林右旗| 古浪县|