您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Java Servlet異步請求開啟的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Java Servlet異步請求開啟的示例分析”這篇文章吧。
在研究長輪詢的實現過程,有使用到Servlet3的異步請求。
以Tomcat服務器為例:
Http請求到達Tomcat
Tomcat從線程池中取出線程處理到達Tomcat的請求
將請求Http解析為HttpServletRequest
分發到具體Servlet處理對應的業務
通過HttpServletResponse返回處理的數據
正常情況下請求模型和上面的模型一樣,所有的請求交給Tomcat服務器的線程池處理,整個動作處理完成才釋放回線程池。
這里就存在了一個問題如果后期的業務處理時間比較長。那么處理請求的線程就會被一直占用。當請求越來越多被占用的線程也會越來越多。直到被耗盡線程池中所有的線程。后續進來的就一直被阻塞等待線程來處理。
當用戶不關心提交的返回可以定義業務處理線程池,前端請求提交后,Tomcat線程將處理提交給業務線程池立即返回。Spring 中的異步任務(@Async)就是這樣的。
同樣以Tomcat服務為例:
將請求Http解析為HttpServletRequest
分發到具體Servlet處理,將業務提交給自定義業務線程池,Tomcat線程立刻被釋放。
當業務線程將任務執行結束,將會將結果轉交給Tomcat線程池。
通過HttpServletResponse返回處理的數據
引入異步Servlet3整體流程:
使用異步 Servelt,Tomcat 線程僅僅處理請求解析動作,所有耗時較長的業務操作全部交給業務線程池,所以相比同步請求, Tomcat 線程可以處理 更多請求。雖然將業務交給了業務流程處理,但是前端還在等待結果返回(同步等待返回)。
異步處理,前端會同步等待結果返回。很多人會覺得異步請求會返回更快。其實不然由于異步存在線程的切換。所有返回時間會比同步的慢。
雖然沒有降低相應時間但是還是有其他明顯的優點:
可以處理更高并發連接數,提高系統整體吞吐量
請求解析與業務處理完全分離,職責單一
自定義業務線程池,我們可以更容易對其監控,降級等處理
可以根據不同業務,自定義不同線程池,相互隔離,不用互相影響
使用異步Servlet只需要三步:
HttpServletRequest#startAsync() 獲取 AsyncContext 異步上下文
使用自定義業務線程池處理業務
AsyncContext#getResponse() 返回處理結果給前端,然后調用 AsyncContext#complete()
代碼如下圖:
開啟異步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異步請求開啟的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。