Tomcat怎么實(shí)現(xiàn)異步Servlet
有時(shí)Servlet在生成響應(yīng)報(bào)文前必須等待某些耗時(shí)的操作,比如在等待一個(gè)可用的JDBC連接或等待一個(gè)遠(yuǎn)程Web服務(wù)的響應(yīng)。對(duì)于這種情況servlet規(guī)范中定義了異步處理方式,由于Servlet中等待阻塞會(huì)導(dǎo)致Web容器整體的處理能力低下,所以對(duì)于比較耗時(shí)的操作可以放置到另外一個(gè)線程中進(jìn)行處理,此過(guò)程保留連接的請(qǐng)求和響應(yīng)對(duì)象,在處理完成之后可以把處理的結(jié)果通知到客戶(hù)端。
下面先看Servlet在同步情況下的處理過(guò)程,如圖所示,Tomcat的客戶(hù)端請(qǐng)求由管道處理最后會(huì)通過(guò)Wrapper容器的管道,這時(shí)它會(huì)調(diào)Servlet實(shí)例的service方法進(jìn)行邏輯處理,處理完后響應(yīng)客戶(hù)端,整個(gè)處理由Tomcat的Executor線程池的線程處理,而線程池的最大線程數(shù)使有限制的,所以這個(gè)處理過(guò)程越短、越快把線程讓回線程池就越好。但如果Servlet中的處理邏輯耗時(shí)越長(zhǎng)就會(huì)導(dǎo)致長(zhǎng)期地占用Tomcat的處理線程池,影響Tomcat的整體處理能力。
為了解決上面的問(wèn)題引入了支持異步的Servlet,同樣是客戶(hù)端請(qǐng)求到來(lái),然后通過(guò)管道最后進(jìn)入到Wrapper容器的管道,調(diào)用Servlet實(shí)例的service后,創(chuàng)建一個(gè)異步上下文將耗時(shí)的邏輯操作封裝起來(lái),交給用戶(hù)自己定義的線程池,這時(shí)Tomcat的處理線程就能馬上回到Executor線程池,而不用等待耗時(shí)的操作完成才讓出線程,從而提升了Tomcat的整體處理能力。這里要注意的是,由于后面做完耗時(shí)的操作后還需要對(duì)客戶(hù)端響應(yīng),所以需要保持住Request和Response對(duì)象,以便輸出響應(yīng)報(bào)文到客戶(hù)端。
再結(jié)合一個(gè)簡(jiǎn)單的異步代碼來(lái)看Tomcat對(duì)Servlet異步的實(shí)現(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() { //耗時(shí)操作 PrintWriter pw; try { pw = ctx.getResponse().getWriter(); pw.print("done!"); pw.flush(); pw.close(); } catch (IOException e) { e.printStackTrace(); } ctx.complete(); } }
我們創(chuàng)建一個(gè)AsyncServlet,它定義了一個(gè)userExecutor線程池專(zhuān)門(mén)用于處理該Servlet的所有請(qǐng)求的耗時(shí)的邏輯操作。這樣就不會(huì)占用Tomcat內(nèi)部的Executor線程池,影響到對(duì)其他Servlet的處理。這種思想有點(diǎn)像資源隔離,耗時(shí)的操作統(tǒng)一由指定的線程池處理,而不要影響其它耗時(shí)少的請(qǐng)求處理。
Servlet的異步的實(shí)現(xiàn)就很好理解了,startAsync方法其實(shí)就是創(chuàng)建了一個(gè)異步上下文AsyncContext對(duì)象,該對(duì)象封裝了請(qǐng)求和響應(yīng)對(duì)象。然后創(chuàng)建一個(gè)任務(wù)用于處理耗時(shí)邏輯,后面通過(guò)AsyncContext對(duì)象獲得響應(yīng)對(duì)象并對(duì)客戶(hù)端響應(yīng),輸出“done!”。完成后要通過(guò)complete方法告訴Tomcat內(nèi)部我已經(jīng)處理完,Tomcat就會(huì)請(qǐng)求對(duì)象和響應(yīng)對(duì)象進(jìn)行回收處理或關(guān)閉連接。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 使用IDEA創(chuàng)建servlet?JavaWeb?應(yīng)用及使用Tomcat本地部署的實(shí)現(xiàn)
- IDEA2021 tomcat10 servlet 較新版本踩坑問(wèn)題
- 深入了解tomcat中servlet的創(chuàng)建方式實(shí)現(xiàn)
- tomcat關(guān)于配置servlet的url-pattern的問(wèn)題思路詳解
- 詳解Tomcat是如何實(shí)現(xiàn)異步Servlet的
- 詳解如何通過(guò)tomcat的ManagerServlet遠(yuǎn)程部署項(xiàng)目
- tomcat中Servlet的工作機(jī)制詳細(xì)介紹
- Tomcat架構(gòu)設(shè)計(jì)及Servlet作用規(guī)范講解
相關(guān)文章
Tomcat 7通過(guò)設(shè)置不同的端口部署兩個(gè)項(xiàng)目
最近因?yàn)橛袀€(gè)Web項(xiàng)目,需要部署兩個(gè)相同項(xiàng)目到Tomcat中,第二個(gè)是拷貝第一個(gè)的,使用的項(xiàng)目是使用SpringMVC框架的,嘗試了幾種方法,這篇文章給大家總結(jié)一個(gè)比較靠譜的方法,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2016-10-10Tomcat部署web項(xiàng)目出現(xiàn)http狀態(tài)404未找到的詳細(xì)解決方案
前兩天在往服務(wù)器上的Tomcat部署Web項(xiàng)目上栽了跟頭,給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于Tomcat部署web項(xiàng)目出現(xiàn)http狀態(tài)404未找到的詳細(xì)解決方案,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03阿里云服務(wù)器安裝配置tomcat 添加外網(wǎng)訪問(wèn)端口的教程
這篇文章主要介紹了阿里云服務(wù)器安裝配置tomcat 添加外網(wǎng)訪問(wèn)端口,需要的朋友可以參考下2019-11-11Tomcat架構(gòu)設(shè)計(jì)及Servlet作用規(guī)范講解
這篇文章主要為大家介紹了Tomcat架構(gòu)設(shè)計(jì)及Servlet作用規(guī)范講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Tomcat8使用cronolog來(lái)進(jìn)行Catalina.Out日志分割方法
今天通過(guò)本文給大家分享如何使用cronolog來(lái)分割catalina.out日志文件,對(duì)Tomcat Catalina.Out日志分割方法感興趣的朋友跟隨小編一起看看吧2021-09-09tomcat內(nèi)存溢出問(wèn)題解決經(jīng)歷
這篇文章主要介紹了tomcat內(nèi)存溢出問(wèn)題解決經(jīng)歷,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09tomcat啟動(dòng)報(bào)錯(cuò)jar not loaded的問(wèn)題
這篇文章主要介紹了tomcat啟動(dòng)報(bào)錯(cuò)jar not loaded的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09同一臺(tái)服務(wù)器(電腦)運(yùn)行多個(gè)Tomcat的設(shè)置方法步驟
這篇文章主要介紹了同一臺(tái)服務(wù)器(電腦)運(yùn)行多個(gè)Tomcat的設(shè)置方法步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04解決tomcat出現(xiàn):java.lang.IllegalStateException:無(wú)輸出目錄問(wèn)題
這篇文章主要介紹了解決tomcat出現(xiàn):java.lang.IllegalStateException:無(wú)輸出目錄問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01