Tomcat怎么實現(xiàn)異步Servlet
有時Servlet在生成響應報文前必須等待某些耗時的操作,比如在等待一個可用的JDBC連接或等待一個遠程Web服務的響應。對于這種情況servlet規(guī)范中定義了異步處理方式,由于Servlet中等待阻塞會導致Web容器整體的處理能力低下,所以對于比較耗時的操作可以放置到另外一個線程中進行處理,此過程保留連接的請求和響應對象,在處理完成之后可以把處理的結(jié)果通知到客戶端。
下面先看Servlet在同步情況下的處理過程,如圖所示,Tomcat的客戶端請求由管道處理最后會通過Wrapper容器的管道,這時它會調(diào)Servlet實例的service方法進行邏輯處理,處理完后響應客戶端,整個處理由Tomcat的Executor線程池的線程處理,而線程池的最大線程數(shù)使有限制的,所以這個處理過程越短、越快把線程讓回線程池就越好。但如果Servlet中的處理邏輯耗時越長就會導致長期地占用Tomcat的處理線程池,影響Tomcat的整體處理能力。
為了解決上面的問題引入了支持異步的Servlet,同樣是客戶端請求到來,然后通過管道最后進入到Wrapper容器的管道,調(diào)用Servlet實例的service后,創(chuàng)建一個異步上下文將耗時的邏輯操作封裝起來,交給用戶自己定義的線程池,這時Tomcat的處理線程就能馬上回到Executor線程池,而不用等待耗時的操作完成才讓出線程,從而提升了Tomcat的整體處理能力。這里要注意的是,由于后面做完耗時的操作后還需要對客戶端響應,所以需要保持住Request和Response對象,以便輸出響應報文到客戶端。
再結(jié)合一個簡單的異步代碼來看Tomcat對Servlet異步的實現(xiàn):
public class AsyncServlet extends HttpServlet { ScheduledThreadPoolExecutor userExecutor = new ScheduledThreadPoolExecutor(5); public void doGet(HttpServletRequest req, HttpServletResponse res) { AsyncContext aCtx = req.startAsync(req, res); userExecutor.execute(new AsyncHandler(aCtx)); } } public class AsyncHandler implements Runnable { private AsyncContext ctx; public AsyncHandler(AsyncContext ctx) { this.ctx = ctx; } @Override public void run() { //耗時操作 PrintWriter pw; try { pw = ctx.getResponse().getWriter(); pw.print("done!"); pw.flush(); pw.close(); } catch (IOException e) { e.printStackTrace(); } ctx.complete(); } }
我們創(chuàng)建一個AsyncServlet,它定義了一個userExecutor線程池專門用于處理該Servlet的所有請求的耗時的邏輯操作。這樣就不會占用Tomcat內(nèi)部的Executor線程池,影響到對其他Servlet的處理。這種思想有點像資源隔離,耗時的操作統(tǒng)一由指定的線程池處理,而不要影響其它耗時少的請求處理。
Servlet的異步的實現(xiàn)就很好理解了,startAsync方法其實就是創(chuàng)建了一個異步上下文AsyncContext對象,該對象封裝了請求和響應對象。然后創(chuàng)建一個任務用于處理耗時邏輯,后面通過AsyncContext對象獲得響應對象并對客戶端響應,輸出“done!”。完成后要通過complete方法告訴Tomcat內(nèi)部我已經(jīng)處理完,Tomcat就會請求對象和響應對象進行回收處理或關(guān)閉連接。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Tomcat部署web項目出現(xiàn)http狀態(tài)404未找到的詳細解決方案
前兩天在往服務器上的Tomcat部署Web項目上栽了跟頭,給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于Tomcat部署web項目出現(xiàn)http狀態(tài)404未找到的詳細解決方案,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-03-03阿里云服務器安裝配置tomcat 添加外網(wǎng)訪問端口的教程
這篇文章主要介紹了阿里云服務器安裝配置tomcat 添加外網(wǎng)訪問端口,需要的朋友可以參考下2019-11-11Tomcat架構(gòu)設計及Servlet作用規(guī)范講解
這篇文章主要為大家介紹了Tomcat架構(gòu)設計及Servlet作用規(guī)范講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08Tomcat8使用cronolog來進行Catalina.Out日志分割方法
今天通過本文給大家分享如何使用cronolog來分割catalina.out日志文件,對Tomcat Catalina.Out日志分割方法感興趣的朋友跟隨小編一起看看吧2021-09-09解決tomcat出現(xiàn):java.lang.IllegalStateException:無輸出目錄問題
這篇文章主要介紹了解決tomcat出現(xiàn):java.lang.IllegalStateException:無輸出目錄問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01