精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

【深入揭秘Tomcat服務(wù)器底層原理】扒下這只又愛又恨的“Tom貓”_IT技術(shù)周刊第607期

技術(shù)期刊
51CTO技術(shù)周刊第607期,為您分享最熱門、最前沿關(guān)于開發(fā)架構(gòu)、系統(tǒng)運(yùn)維、大數(shù)據(jù)、區(qū)塊鏈、人工智能等一線技術(shù)解析和實(shí)踐案例等深度干貨文章,愿我們一起悅享技術(shù),成就CTO夢想,歡迎訂閱!

 Tomcat是什么?

Tomcat是開源的 Java Web 應(yīng)用服務(wù)器,實(shí)現(xiàn)了 Java EE 的部分技術(shù)規(guī)范,比如 Java Servlet、Java Server Page、JSTL、Java WebSocket。Java EE 是 Sun 公 司為企業(yè)級應(yīng)用推出的標(biāo)準(zhǔn)平臺,定義了一系列用于企業(yè)級開發(fā)的技術(shù)規(guī)范。除了上述的之外,還有 EJB、Java Mail、JPA、JTA、JMS 等,而這些都依賴具體容器的實(shí)現(xiàn)。

[[287356]]

上圖對比了 Java EE 容器的實(shí)現(xiàn)情況,Tomcat 和 Jetty 都只提供了 Java Web 容器必需的 Servlet 和 JSP 規(guī)范,開發(fā)者要想實(shí)現(xiàn)其他的功能,需要自己依賴其他開源實(shí)現(xiàn)。

Glassfish 是由 sun 公司推出,Java EE 最新規(guī)范出來之后,首先會在 Glassfish 上進(jìn)行實(shí)現(xiàn),所以是研究 Java EE 最新技術(shù)的首選

最常見的情況是使用 Tomcat 作為 Java Web 服務(wù)器,使用 Spring 提供的開箱即用的強(qiáng)大功能,并依賴其他開源庫來完成負(fù)責(zé)的業(yè)務(wù)功能實(shí)現(xiàn)。

Servlet容器

Tomcat 組成

如下圖所示,主要有 Container 和 Connector 以及相關(guān)組件構(gòu)成。

  • Server:指的就是整個(gè) Tomcat 服 務(wù)器,包含多組服務(wù),負(fù)責(zé)管理和 啟動各個(gè) Service,同時(shí)監(jiān)聽 8005 端口發(fā)過來的 shutdown 命令,用 于關(guān)閉整個(gè)容器 ;
  • Service:Tomcat 封裝的、對外提 供完整的、基于組件的 web 服務(wù), 包含 Connectors、Container 兩個(gè) 核心組件,以及多個(gè)功能組件,各 個(gè) Service 之間是獨(dú)立的,但是共享 同一 JVM 的資源 ;
  • Connector:Tomcat 與外部世界的連接器,監(jiān)聽固定端口接收外部請求,傳遞給 Container,并 將 Container 處理的結(jié)果返回給外部
  • Container:Catalina,Servlet 容器,內(nèi)部有多層容器組成,用于管理 Servlet 生命周期,調(diào)用 servlet 相關(guān)方法
  • Loader:封裝了 Java ClassLoader,用于 Container 加載類文件;Realm:Tomcat 中為 web 應(yīng)用程序提供訪問認(rèn)證和角色管理的機(jī)制;
  • JMX:Java SE 中定義技術(shù)規(guī)范,是一個(gè)為應(yīng)用程序、設(shè)備、系統(tǒng)等植入管理功能的框架,通過 JMX 可以遠(yuǎn)程監(jiān)控 Tomcat 的運(yùn)行狀態(tài)
  • Jasper:Tomcat 的 Jsp 解析引擎,用于將 Jsp 轉(zhuǎn)換成 Java 文件,并編譯成 class 文件。Session:負(fù)責(zé)管理和創(chuàng)建 session,以及 Session 的持久化(可自定義),支持 session 的集群。
  • Pipeline:在容器中充當(dāng)管道的作用,管道中可以設(shè)置各種 valve(閥門),請求和響應(yīng)在經(jīng)由管 道中各個(gè)閥門處理,提供了一種靈活可配置的處理請求和響應(yīng)的機(jī)制。
  • Naming:命名服務(wù),JNDI, Java 命名和目錄接口,是一組在 Java 應(yīng)用中訪問命名和目錄服務(wù)的 API。命名服務(wù)將名稱和對象聯(lián)系起來,使得我們可以用名稱訪問對象,目錄服務(wù)也是一種命名 服務(wù),對象不但有名稱,還有屬性。Tomcat 中可以使用 JNDI 定義數(shù)據(jù)源、配置信息,用于開發(fā) 與部署的分離。

Container組成

  • Engine:Servlet 的頂層容器,包含一 個(gè)或多個(gè) Host 子容器;
  • Host:虛擬主機(jī),負(fù)責(zé) web 應(yīng)用的部 署和 Context 的創(chuàng)建;
  • Context:Web 應(yīng)用上下文,包含多個(gè) Wrapper,負(fù)責(zé) web 配置的解析、管 理所有的 Web 資源;
  • Wrapper:最低層的容器,是對 Servlet 的封裝,負(fù)責(zé) Servlet 實(shí)例的創(chuàng) 建、執(zhí)行和銷毀。

生命周期管理

Tomcat 為了方便管理組件和容器的生命周期,定義了從創(chuàng)建、啟動、到停止、銷毀共 12 種狀態(tài)。

tomcat 生命周期管理了內(nèi)部狀態(tài)變化的規(guī)則控制,組件和容器只需實(shí)現(xiàn)相應(yīng)的生命周期方法,即可完成各生命周期內(nèi)的操作(initInternal、startInternal、stopInternal、 destroyInternal);

比如執(zhí)行初始化操作時(shí),會判斷當(dāng)前狀態(tài)是否 New,如果不是則拋出生命周期異常;是的話則設(shè)置當(dāng)前狀態(tài)為 Initializing,并執(zhí)行 initInternal 方法,由子類實(shí)現(xiàn),方法執(zhí)行成功則設(shè)置當(dāng)前狀態(tài)為 Initialized,執(zhí)行失敗則設(shè)置為 Failed 狀態(tài);

Tomcat 的生命周期管理引入了事件機(jī)制,在組件或容器的生命周期狀態(tài)發(fā)生變化時(shí)會通知事件監(jiān)聽器,監(jiān)聽器通過判斷事件的類型來進(jìn)行相應(yīng)的操作。事件監(jiān)聽器的添加可以在 server.xml 文件中進(jìn)行配置;

Tomcat 各類容器的配置過程是通過添加 listener 的方式來進(jìn)行的,從而達(dá)到配置邏輯與容器的解耦。如 EngineConfig、HostConfig、ContextConfig。

  • EngineConfig:主要打印啟動和停止日志
  • HostConfig:主要處理部署應(yīng)用,解析應(yīng)用 META-INF/context.xml 并創(chuàng)建應(yīng)用
  • Context ContextConfig:主要解析并合并 web.xml,掃描應(yīng)用的各類 web 資源 (filter、servlet、listener)

Tomcat 的啟動過程

啟動從 Tomcat 提供的 start.sh 腳本開始,shell 腳本會調(diào)用 Bootstrap 的 main 方法,實(shí)際調(diào)用了 Catalina 相應(yīng)的 load、start 方法。

load 方法會通過 Digester 進(jìn)行 config/server.xml 的解析,在解析的過程中會根據(jù) xml 中的關(guān)系 和配置信息來創(chuàng)建容器,并設(shè)置相關(guān)的屬性。

接著 Catalina 會調(diào)用 StandardServer 的 init 和 start 方法進(jìn)行容器的初始化和啟動。

按照 xml 的配置關(guān)系,server 的子元素是 service,service 的子元素是頂層容器 Engine,每層容器都持有自己的子容器,而這些元素都實(shí)現(xiàn)了生命周期管理的各個(gè)方法,因此就很容易的完成整個(gè)容器的啟動、關(guān)閉等生命周期的管理。

StandardServer 完成 init 和 start 方法調(diào)用后,會一直監(jiān)聽來自 8005 端口(可配置)。

如果接收 到 shutdown 命令,則會退出循環(huán)監(jiān)聽,執(zhí)行后續(xù)的 stop 和 destroy 方法,完成 Tomcat 容器的關(guān)閉。

同時(shí)也會調(diào)用 JVM 的 Runtime.getRuntime()﴿.addShutdownHook 方法,在虛擬機(jī)意外退出的時(shí)候來關(guān)閉容器。

所有容器都是繼承自 ContainerBase,基類中封裝了容器中的重復(fù)工作,負(fù)責(zé)啟動容器相關(guān)的組件 Loader、Logger、Manager、Cluster、Pipeline,啟動子容器(線程池并發(fā)啟動子容器,通過線程池 submit 多個(gè)線程,調(diào)用后返回 Future 對象,線程內(nèi)部啟動子容器,接著調(diào)用 Future 對象 的 get 方法來等待執(zhí)行結(jié)果)。

  1. List<future> results = new ArrayList<future>();  
  2. for (int i = 0; i < children.length; i++) {  
  3. results.add(startStopExecutor.submit(new StartChild(children[i])));  
  4.  
  5. boolean fail = false 
  6. for (Futureresult :results) {  
  7. try {  
  8. result.get();  
  9. } catch (Exception e) {  
  10. log.error(sm.getString("containerBase.threadedStartFailed"), e);  
  11. fail = true 
  12.  

Web 應(yīng)用的部署方式

注:catalina.home:安裝目錄;catalina.base:工作目錄;默認(rèn)值 user.dir

  • Server.xml 配置 Host 元素,指定 appBase 屬性,默認(rèn)\$catalina.base/webapps/
  • Server.xml 配置 Context 元素,指定 docBase,元素,指定 web 應(yīng)用的路徑
  • 自定義配置:在\$catalina.base/EngineName/HostName/XXX.xml 配置 Context 元素

HostConfig 監(jiān)聽了 StandardHost 容器的事件,在 start 方法中解析上述配置文件:

  • 掃描 appbase 路徑下的所有文件夾和 war 包,解析各個(gè)應(yīng)用的 META-INF/context.xml,并 創(chuàng)建 StandardContext,并將 Context 加入到 Host 的子容器中。
  • 解析$catalina.base/EngineName/HostName/下的所有 Context 配置,找到相應(yīng) web 應(yīng) 用的位置,解析各個(gè)應(yīng)用的 META-INF/context.xml,并創(chuàng)建 StandardContext,并將 Context 加入到 Host 的子容器中。

注:

  • HostConfig 并沒有實(shí)際解析 Context.xml,而是在 ContextConfig 中進(jìn)行的。
  • HostConfig 中會定期檢查 watched 資源文件(context.xml 配置文件)

ContextConfig 解析 context.xml 順序:

  • 先解析全局的配置 config/context.xml
  • 然后解析 Host 的默認(rèn)配置 EngineName/HostName/context.xml.default
  • 最后解析應(yīng)用的 META-INF/context.xml

ContextConfig 解析 web.xml 順序:

  • 先解析全局的配置 config/web.xml
  • 然后解析 Host 的默認(rèn)配置 EngineName/HostName/web.xml.default 接著解析應(yīng)用的 MEB-INF/web.xml
  • 掃描應(yīng)用 WEB-INF/lib/下的 jar 文件,解析其中的 META-INF/web-fragment.xml 最后合并 xml 封裝成 WebXml,并設(shè)置 Context

注:

  • 掃描 web 應(yīng)用和 jar 中的注解(Filter、Listener、Servlet)就是上述步驟中進(jìn)行的。
  • 容器的定期執(zhí)行:backgroundProcess,由 ContainerBase 來實(shí)現(xiàn)的,并且只有在頂層容器 中才會開啟線程。(backgroundProcessorDelay=10 標(biāo)志位來控制)

Servlet 生命周期

Servlet 是用 Java 編寫的服務(wù)器端程序,其主要功能在于交互式地瀏覽和修改數(shù)據(jù),生成動態(tài) Web 內(nèi)容。

  1. 請求到達(dá) server 端,server 根據(jù) url 映射到相應(yīng)的 Servlet
  2. 判斷 Servlet 實(shí)例是否存在,不存在則加載和實(shí)例化 Servlet 并調(diào)用 init 方法
  3. Server 分別創(chuàng)建 Request 和 Response 對象,調(diào)用 Servlet 實(shí)例的 service 方法(service 方法 內(nèi)部會根據(jù) http 請求方法類型調(diào)用相應(yīng)的 doXXX 方法)
  4. doXXX 方法內(nèi)為業(yè)務(wù)邏輯實(shí)現(xiàn),從 Request 對象獲取請求參數(shù),處理完畢之后將結(jié)果通過 response 對象返回給調(diào)用方
  5. 當(dāng) Server 不再需要 Servlet 時(shí)(一般當(dāng) Server 關(guān)閉時(shí)),Server 調(diào)用 Servlet 的 destroy() 方 法。
  1. load on startup 

當(dāng)值為 0 或者大于 0 時(shí),表示容器在應(yīng)用啟動時(shí)就加載這個(gè) servlet; 當(dāng)是一個(gè)負(fù)數(shù)時(shí)或者沒有指定時(shí),則指示容器在該 servlet 被選擇時(shí)才加載; 正數(shù)的值越小,啟動該 servlet 的優(yōu)先級越高;

  1. single thread model 

每次訪問 servlet,新建 servlet 實(shí)體對象,但并不能保證線程安全,同時(shí) tomcat 會限制 servlet 的實(shí)例數(shù)目。

請求處理過程

  1. 根據(jù) server.xml 配置的指定的 connector 以及端口監(jiān)聽 http、或者 ajp 請求
  2. 請求到來時(shí)建立連接,解析請求參數(shù),創(chuàng)建 Request 和 Response 對象,調(diào)用頂層容器 pipeline 的 invoke 方法
  3. 容器之間層層調(diào)用,最終調(diào)用業(yè)務(wù) servlet 的 service 方法
  4. Connector 將 response 流中的數(shù)據(jù)寫到 socket 中

Pipeline 與 Valve

Pipeline 可以理解為現(xiàn)實(shí)中的管道,Valve 為管道中的閥門,Request 和 Response 對象在管道中 經(jīng)過各個(gè)閥門的處理和控制。

每個(gè)容器的管道中都有一個(gè)必不可少的 basic valve,其他的都是可選的,basic valve 在管道中最后調(diào)用,同時(shí)負(fù)責(zé)調(diào)用子容器的第一個(gè) valve。

Valve 中主要的三個(gè)方法:setNext、getNext、invoke;valve 之間的關(guān)系是單向鏈?zhǔn)浇Y(jié)構(gòu),本身 invoke 方法中會調(diào)用下一個(gè) valve 的 invoke 方法。

各層容器對應(yīng)的 basic valve 分別是 StandardEngineValve、StandardHostValve、 StandardContextValve、StandardWrapperValve。

JSP引擎

JSP 生命周期

  • 編譯階段:servlet 容器編譯 servlet 源文
  • 件,生成 servlet 類
  • 初始化階段:加載與 JSP 對應(yīng)的 servlet 類, 創(chuàng)建其實(shí)例,并調(diào)用它的初始化方法
  • 執(zhí)行階段:調(diào)用與 JSP 對應(yīng)的 servlet 實(shí)例的 服務(wù)方法
  • 銷毀階段:調(diào)用與 JSP 對應(yīng)的 servlet 實(shí)例的 銷毀方法,然后銷毀 servlet 實(shí)例

JSP元素

代碼片段:<%>

JSP聲明:<%! ...="">

JSP表達(dá)式:<%=>

JSP注釋:<%-->

JSP指令:<%@ directive="" attribute="“value”">

JSP行為:

HTML元素:html/head/body/div/p/…

JSP隱式對象:request、response、out、session、application、config、pageContext、page、Exception

JSP 元素說明

  • 代碼片段:包含任意量的 Java 語句、變量、方法或表達(dá)式;
  • JSP 聲明:一個(gè)聲明語句可以聲明一個(gè)或多個(gè)變量、方法,供后面的 Java 代碼使用;
  • JSP 表達(dá)式:輸出 Java 表達(dá)式的值,String 形式;
  • JSP 注釋:為代碼作注釋以及將某段代碼注釋掉
  • JSP 指令:用來設(shè)置與整個(gè) JSP 頁面相關(guān)的屬性
  • <%@ page="" ...="">定義頁面的依賴屬性,比如 language、contentType、errorPage、 isErrorPage、import、isThreadSafe、session 等等
  • <%@ include="" ...="">包含其他的 JSP 文件、HTML 文件或文本文件,是該 JSP 文件的一部分,會被同時(shí)編譯執(zhí)行
  • <%@ taglib="" ...="">引入標(biāo)簽庫的定義,可以是自定義標(biāo)簽
  • JSP 行為:jsp:include、jsp:useBean、jsp:setProperty、jsp:getProperty、jsp:forward

JSP 解析過程

  • 代碼片段:在_jspService()方法內(nèi)直接輸出
  • JSP 聲明: 在 servlet 類中進(jìn)行輸出
  • JSP 表達(dá)式:在_jspService()方法內(nèi)直接輸出
  • JSP 注釋:直接忽略,不輸出
  • JSP 指令:根據(jù)不同指令進(jìn)行區(qū)分,include:對引入的文件進(jìn)行解析;page 相關(guān)的屬性會做為 JSP 的屬性,影響的是解析和請求處理時(shí)的行為
  • JSP 行為:不同的行為有不同的處理方式,jsp:useBean 為例,會從 pageContext 根據(jù) scope 的 類別獲取 bean 對象,如果沒有會創(chuàng)建 bean,同時(shí)存到相應(yīng) scope 的 pageContext 中
  • HTML:在_jspService()方法內(nèi)直接輸出
  • JSP 隱式對象:在_jspService()方法會進(jìn)行聲明,只能在方法中使用;

Connector

Http:HTTP 是超文本傳輸協(xié)議,是客戶端瀏覽器或其他程序與 Web 服務(wù)器之間的應(yīng)用層通信協(xié)議。

AJP:Apache JServ 協(xié)議(AJP)是一種二進(jìn)制協(xié)議,專門代理從 Web 服務(wù)器到位于后端的應(yīng)用 程序服務(wù)器的入站請求。

阻塞 IO

非阻塞 IO

IO多路復(fù)用

阻塞與非阻塞的區(qū)別在于進(jìn)行讀操作和寫操作的系統(tǒng)調(diào)用時(shí),如果此時(shí)內(nèi)核態(tài)沒有數(shù)據(jù)可讀或者沒有緩沖空間可寫時(shí),是否阻塞。

IO多路復(fù)用的好處在于可同時(shí)監(jiān)聽多個(gè)socket的可讀和可寫事件,這樣就能使得應(yīng)用可以同時(shí)監(jiān)聽多個(gè)socket,釋放了應(yīng)用線程資源。

Tomcat各類Connector對比

Connector的實(shí)現(xiàn)模式有三種,分別是BIO、NIO、APR,可以在server.xml中指定。

  • JIO:用java.io編寫的TCP模塊,阻塞IO
  • NIO:用java.nio編寫的TCP模塊,非阻塞IO,(IO多路復(fù)用)
  • APR:全稱Apache Portable Runtime,使用JNI的方式來進(jìn)行讀取文件以及進(jìn)行網(wǎng)絡(luò)傳輸

Apache Portable Runtime是一個(gè)高度可移植的庫,它是Apache HTTP Server 2.x的核心。

APR具有許多用途,包括訪問高級IO功能(如sendfile,epoll和OpenSSL),操作系統(tǒng)級功能(隨機(jī)數(shù)生成,系統(tǒng)狀態(tài)等)和本地進(jìn)程處理(共享內(nèi)存,NT管道和Unix套接字)。

表格中字段含義說明:

  • Support Polling:是否支持基于IO多路復(fù)用的socket事件輪詢
  • Polling Size:輪詢的最大連接數(shù)
  • Wait for next Request:在等待下一個(gè)請求時(shí),處理線程是否釋放,BIO是沒有釋放的,所以在keep-alive=true的情況下處理的并發(fā)連接數(shù)有限
  • Read Request Headers:由于request header數(shù)據(jù)較少,可以由容器提前解析完畢,不需要阻塞
  • Read Request Body:讀取request body的數(shù)據(jù)是應(yīng)用業(yè)務(wù)邏輯的事情,同時(shí)Servlet的限制,是需要阻塞讀取的
  • Write Response:跟讀取request body的邏輯類似,同樣需要阻塞寫

NIO處理相關(guān)類

Acceptor線程負(fù)責(zé)接收連接,調(diào)用accept方法阻塞接收建立的連接,并對socket進(jìn)行封裝成PollerEvent,指定注冊的事件為op_read,并放入到EventQueue隊(duì)列中,PollerEvent的run方法邏輯的是將Selector注冊到socket的指定事件;

Poller線程從EventQueue獲取PollerEvent,并執(zhí)行PollerEvent的run方法,調(diào)用Selector的select方法,如果有可讀的Socket則創(chuàng)建Http11NioProcessor,放入到線程池中執(zhí)行;

CoyoteAdapter是Connector到Container的適配器,Http11NioProcessor調(diào)用其提供的service方法,內(nèi)部創(chuàng)建Request和Response對象,并調(diào)用最頂層容器的Pipeline中的第一個(gè)Valve的invoke方法;

Mapper主要處理http url 到servlet的映射規(guī)則的解析,對外提供map方法。

NIO Connector主要參數(shù)

Comet

Comet是一種用于web的推送技術(shù),能使服務(wù)器實(shí)時(shí)地將更新的信息傳送到客戶端,而無須客戶端發(fā)出請求;

在WebSocket出來之前,如果不適用comet,只能通過瀏覽器端輪詢Server來模擬實(shí)現(xiàn)服務(wù)器端推送;

Comet支持servlet異步處理IO,當(dāng)連接上數(shù)據(jù)可讀時(shí)觸發(fā)事件,并異步寫數(shù)據(jù)(阻塞)。

Tomcat要實(shí)現(xiàn)Comet,只需繼承HttpServlet同時(shí),實(shí)現(xiàn)CometProcessor接口。

  • Begin:新的請求連接接入調(diào)用,可進(jìn)行與Request和Response相關(guān)的對象初始化操作,并保存response對象,用于后續(xù)寫入數(shù)據(jù)
  • Read:請求連接有數(shù)據(jù)可讀時(shí)調(diào)用
  • End:當(dāng)數(shù)據(jù)可用時(shí),如果讀取到文件結(jié)束或者response被關(guān)閉時(shí)則被調(diào)用
  • Error:在連接上發(fā)生異常時(shí)調(diào)用,數(shù)據(jù)讀取異常、連接斷開、處理異常、socket超時(shí)

Note:

  • Read:在post請求有數(shù)據(jù),但在begin事件中沒有處理,則會調(diào)用read,如果read沒有讀取數(shù)據(jù),在會觸發(fā)Error回調(diào),關(guān)閉socket
  • End:當(dāng)socket超時(shí),并且response被關(guān)閉時(shí)也會調(diào)用;server被關(guān)閉時(shí)調(diào)用
  • Error:除了socket超時(shí)不會關(guān)閉socket,其他都會關(guān)閉socket
  • End和Error時(shí)間觸發(fā)時(shí)應(yīng)關(guān)閉當(dāng)前comet會話,即調(diào)用CometEvent的close方法
  • Note:在事件觸發(fā)時(shí)要做好線程安全的操作

異步Servlet

傳統(tǒng)流程:

  • 首先,Servlet 接收到請求之后,request數(shù)據(jù)解析;
  • 接著,調(diào)用業(yè)務(wù)接口的某些方法,以完成業(yè)務(wù)處理;
  • 最后,根據(jù)處理的結(jié)果提交響應(yīng),Servlet 線程結(jié)束。

異步處理流程:

  • 客戶端發(fā)送一個(gè)請求
  • Servlet容器分配一個(gè)線程來處理容器中的一個(gè)servlet
  • servlet調(diào)用request.startAsync(),保存AsyncContext, 然后返回
  • 任何方式存在的容器線程都將退出,但是response仍然保持開放
  • 業(yè)務(wù)線程使用保存的AsyncContext來完成響應(yīng)(線程池)

客戶端收到響應(yīng)

Servlet 線程將請求轉(zhuǎn)交給一個(gè)異步線程來執(zhí)行業(yè)務(wù)處理,線程本身返回至容器,此時(shí) Servlet 還沒有生成響應(yīng)數(shù)據(jù),異步線程處理完業(yè)務(wù)以后,可以直接生成響應(yīng)數(shù)據(jù)(異步線程擁有 ServletRequest 和 ServletResponse 對象的引用)。

為什么web應(yīng)用中支持異步?

推出異步,主要是針對那些比較耗時(shí)的請求:比如一次緩慢的數(shù)據(jù)庫查詢,一次外部REST API調(diào)用, 或者是其他一些I/O密集型操作。這種耗時(shí)的請求會很快的耗光Servlet容器的線程池,繼而影響可擴(kuò)展性。

Note:從客戶端的角度來看,request仍然像任何其他的HTTP的request-response交互一樣,只是耗費(fèi)了更長的時(shí)間而已。

異步事件監(jiān)聽

  • onStartAsync:Request調(diào)用startAsync方法時(shí)觸發(fā)
  • onComplete:syncContext調(diào)用complete方法時(shí)觸發(fā)
  • onError:處理請求的過程出現(xiàn)異常時(shí)觸發(fā)
  • onTimeout:socket超時(shí)觸發(fā)

Note :

onError/ onTimeout觸發(fā)后,會緊接著回調(diào)onComplete

onComplete 執(zhí)行后,就不可再操作request和response

 

責(zé)任編輯:張潔 來源: 技術(shù)周刊
相關(guān)推薦

2019-11-19 15:08:47

Tomcat服務(wù)器底層

2013-12-06 10:11:48

Windows 8Windows 7Windows 8.1

2022-03-04 12:09:25

SQL數(shù)據(jù)量多表查詢

2014-12-04 09:58:59

PHP

2019-08-06 08:47:18

運(yùn)營商流量套餐4G服務(wù)

2022-02-22 09:12:18

TypescriptJavaScrip語言

2024-12-04 13:54:19

pnpm存儲項(xiàng)目

2015-04-13 15:41:41

IT技術(shù)周刊

2009-09-22 15:50:27

WSUS服務(wù)器

2010-06-22 16:31:19

IT技術(shù)周刊

2021-08-02 18:14:52

技術(shù)資訊

2016-03-21 09:05:06

2013-06-25 17:05:53

棱鏡網(wǎng)絡(luò)·安全技術(shù)周刊

2011-10-18 09:35:28

虛擬化瘦客戶端Windows Thi

2015-03-19 09:42:05

網(wǎng)絡(luò)·安全技術(shù)周刊

2015-04-13 15:30:54

網(wǎng)絡(luò)·安全技術(shù)周刊

2009-07-06 14:27:09

技術(shù)周刊51CTO操作系統(tǒng)

2010-09-14 10:29:43

配置tftp服務(wù)器

2010-07-05 16:17:30

IT技術(shù)周刊

2011-02-16 10:23:39

IT技術(shù)周刊
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

免费视频国产一区| 久久不射影院| 精品亚洲成av人在线观看| 日韩在线免费观看视频| 被黑人猛躁10次高潮视频| 国产精品一区二区日韩| 欧美激情自拍偷拍| 超碰97在线人人| 无码免费一区二区三区| 午夜激情一区| 精品视频一区在线视频| 亚洲理论中文字幕| 范冰冰一级做a爰片久久毛片| 国产精品色婷婷| 国产成人精品免费视频大全最热| 天堂网中文字幕| 午夜欧美理论片| 国产一区二区三区四区福利| 黑人玩弄人妻一区二区三区| 国产91亚洲精品久久久| 偷拍日韩校园综合在线| 综合一区中文字幕| 欧美男男同志| 国产+成+人+亚洲欧洲自线| 国产高清在线不卡| 日韩精品在线免费看| 五月婷婷亚洲| 亚洲视频在线免费观看| 午夜不卡久久精品无码免费| 欧美综合影院| 在线观看一区二区视频| 国产伦精品一区二区三区四区视频_| 香蕉视频在线看| 国产91在线看| 成人日韩在线电影| 国产在线一级片| 亚洲在线观看| 韩国美女主播一区| 久草网视频在线观看| 久久影院100000精品| 亚洲欧美一区二区三区久久| 亚洲激情 欧美| 日韩激情精品| 欧美一区三区二区| 日韩av一卡二卡三卡| 欧美性片在线观看| 日本道在线观看一区二区| 妞干网在线视频观看| 色图在线观看| 亚洲美女免费视频| 法国空姐在线观看免费| а√资源新版在线天堂| 中文字幕一区在线| 一区二区精品国产| 日本最黄一级片免费在线| 中日韩免费视频中文字幕| 青娱乐一区二区| 黄色国产在线| 日本一区二区不卡视频| 日韩欧美三级一区二区| wwwxxx在线观看| 欧美国产一区二区| 亚洲欧美日韩精品久久久| av男人的天堂在线| 国产精品福利影院| 吴梦梦av在线| 呦呦在线视频| 香蕉乱码成人久久天堂爱免费| 97在线国产视频| 无码小电影在线观看网站免费| 欧美日韩激情美女| 欧美视频免费播放| 国产精品原创视频| 宅男噜噜噜66一区二区66| 999久久久精品视频| 亚洲精品a区| 亚洲国产精品va| 蜜臀av一区二区三区有限公司| 免费看成人哺乳视频网站| 亚洲天堂av网| 女同久久另类69精品国产| 欧美.www| 国产91精品不卡视频| 欧美日韩在线视频播放| 久久爱另类一区二区小说| 97超碰人人模人人爽人人看| 日韩一级片免费在线观看| 久久精品一区八戒影视| 欧美日本一道本在线视频| 欧美激情第六页| 在线免费看a| 亚洲精品午夜久久久| 日韩精品xxxx| 国产精品久久久久久久久免费高清| 欧美精品在线视频| 野战少妇38p| 国产毛片一区二区三区| 久久精品久久久久久| 国产一级在线免费观看| 日韩精品乱码av一区二区| 成人有码在线视频| 日本五码在线| 最新久久zyz资源站| 日韩欧美一区二| 免费日韩成人| 日韩精品极品毛片系列视频| 中文国语毛片高清视频| 亚洲福利电影| 国产欧美日韩免费| 乱精品一区字幕二区| 国产精品久久久久久久第一福利 | 91精品啪在线观看国产爱臀| 亚洲男人天堂古典| 久久久久无码精品国产| 日本成人超碰在线观看| 国产一区二区不卡视频| 国产调教视频在线观看| 日韩欧美中文在线| 国产高潮视频在线观看| 久久高清免费| 奇米四色中文综合久久| 亚洲av无码一区二区三区性色| 国产欧美日韩亚州综合| 欧美 国产 综合| 亚洲精品18| 另类美女黄大片| 中文字幕av久久爽| 久久久久国产免费免费| 国产九九九九九| 超碰地址久久| 久久精品国产亚洲| 在线黄色av网站| 国产日韩欧美精品在线| 青青青免费在线| 黄色欧美网站| 欧美高清一级大片| 99热这里只有精品9| 国产精品第五页| 亚洲不卡视频在线| 国产欧美日韩视频在线| 8x拔播拔播x8国产精品| 免费av网站在线播放| 一区二区三区四区不卡在线| 亚洲自拍第三页| 久久精品亚洲欧美日韩精品中文字幕| 国产成人亚洲精品| 日本不卡视频一区二区| 欧美日韩亚洲91| 少妇极品熟妇人妻无码| 欧美日韩精品| 99久久99久久精品国产片| av网址在线看| 日韩美一区二区三区| 欧美精品久久久久性色| 国产精品亚洲а∨天堂免在线| 亚洲av综合色区| 日韩精品一区二区三区中文在线| 麻豆成人在线看| www.国产免费| 亚洲综合区在线| 91传媒理伦片在线观看| 99精品国产一区二区青青牛奶 | 国产视频一区二区三| 综合av第一页| 性感美女一区二区三区| 亚洲精品乱码| 欧美性大战久久久久| 天堂久久午夜av| xvideos亚洲| 朝桐光av在线一区二区三区| 一区二区不卡在线播放 | 隔壁人妻偷人bd中字| 国内露脸中年夫妇交换精品| 奇米四色中文综合久久| 婷婷在线视频观看| 欧美一级在线免费| 日本在线观看中文字幕| 国产网站一区二区| 午夜剧场在线免费观看| 欧美视频不卡| 欧美另类高清视频在线| 久久精品黄色| 久久久久久久色| 大胆av不用播放器在线播放 | 精品国产aⅴ| 成人免费xxxxx在线观看| 肉肉视频在线观看| 亚洲美女中文字幕| 懂色av蜜臀av粉嫩av喷吹| 亚洲欧洲综合另类在线| 一起草在线视频| 免费成人在线影院| 日韩一区二区高清视频| 国产在线观看91一区二区三区| 91精品久久久久久久久久久久久| 久久久久黄久久免费漫画| 亚洲欧美一区二区三区久久| 国产三级在线观看视频| 色综合久久久久网| www欧美com| 久久精品在线免费观看| www.欧美com| 日韩中文字幕1| 日本男女交配视频| 欧美一区二区三区高清视频| 国产精品高清一区二区三区| 久久xxx视频| 性欧美办公室18xxxxhd| 激情在线小视频| 亚洲免费成人av电影| 国产黄色av片| 欧美日韩精品一区视频| 久久视频免费在线观看| 亚洲天天做日日做天天谢日日欢| 九色porny自拍视频| 国产成人在线视频网址| 欧美日韩亚洲自拍| 国产精品五区| 国产欧美精品aaaaaa片| 婷婷久久国产对白刺激五月99| 欧美不卡三区| 欧美人与动xxxxz0oz| 亚洲综合视频1区| 成人国产精品| 欧美综合在线第二页| 美女日批视频在线观看| 久久久国产成人精品| 成a人片在线观看www视频| 国产丝袜精品视频| 三级网站免费观看| 亚洲精品在线三区| 精品区在线观看| 欧美一区二区三区视频在线| 一级视频在线播放| 欧美午夜精品久久久久久孕妇| 天天综合天天干| 亚洲高清免费在线| 久久艹精品视频| 亚洲综合在线免费观看| 成人高潮免费视频| 亚洲欧洲无码一区二区三区| 亚洲不卡的av| 国产精品视频在线看| 公肉吊粗大爽色翁浪妇视频| 久久蜜桃av一区精品变态类天堂 | 九九久久久久99精品| 麻豆网站在线| 久久久精品在线观看| 欧美三级电影一区二区三区| 中文字幕日韩欧美在线| av在线日韩国产精品| 国产一区二区三区直播精品电影| 邻居大乳一区二区三区| 亚洲男人天堂2023| 大地资源中文在线观看免费版| 在线亚洲午夜片av大片| 3d成人动漫在线| 中文字幕国产亚洲| 一区二区三区视频在线观看视频| 最新国产精品亚洲| 黄视频网站在线| 欧美成人自拍视频| 久草在线视频福利| 久久久日本电影| 中文字幕在线直播| 国产精品91在线| 电影亚洲精品噜噜在线观看 | 精品国产亚洲日本| 波多野结衣久草一区| 老司机精品视频在线播放| 美女主播视频一区| 日本久久综合| 日韩最新中文字幕| 亚洲一级二级| 欧美女人性生活视频| 捆绑紧缚一区二区三区视频| 国产黄色一区二区三区| 成人晚上爱看视频| 中日韩精品一区二区三区 | 裸体丰满少妇做受久久99精品| 综合亚洲自拍| 在线观看成人一级片| 欧美激情亚洲| 亚洲乱码中文字幕久久孕妇黑人| 喷白浆一区二区| 男生和女生一起差差差视频| av电影在线观看一区| 亚洲国产日韩一区无码精品久久久| 自拍偷拍国产亚洲| 国产精品男女视频| 正在播放亚洲一区| 清纯唯美亚洲色图| 久久影院在线观看| 91久久国产综合久久91猫猫| 91免费版网站入口| 亚洲第一二三区| 四虎4hu永久免费入口| 丝瓜av网站精品一区二区| 欧美体内she精高潮| 久久久久99精品国产片| 免费在线一区二区三区| 91成人网在线| 日本激情一区二区三区| 色悠悠久久88| 小早川怜子影音先锋在线观看| 国产一区二区丝袜| 一本色道久久综合亚洲精品酒店| 91手机视频在线| 久久激情视频| 亚洲国产精品狼友在线观看| 国产精品免费网站在线观看| 久久亚洲精品国产| 欧美成人a∨高清免费观看| 成人在线播放视频| 国内自拍欧美激情| 免费精品一区| 亚洲综合第一| 日韩一区精品视频| 欧美xxxxx少妇| 一区二区三区四区亚洲| 一区二区国产欧美| 亚洲视频第一页| 超碰在线cao| www.成人av| 亚洲最新av| 中文字幕免费高清在线| 国产亚洲精品精华液| 超碰超碰超碰超碰| 精品处破学生在线二十三| h片在线免费| 91亚洲国产成人精品性色| 青青草成人影院| 黑森林福利视频导航| 99久久久精品| 国产一级aa大片毛片| 欧美一区二区三区视频| 国产秀色在线www免费观看| 国产精品一区二区久久久| 精品欧美久久| 性欧美极品xxxx欧美一区二区| 99精品视频免费版的特色功能| 中文字幕一区二区日韩精品绯色| 波多野结衣一区二区三区在线 | 色综合中文字幕国产| 五十路在线观看| 午夜精品久久久久久久99热| 国产欧美自拍一区| 黄色www网站| 99re成人精品视频| 国产精品免费av一区二区| 亚洲国产精品va在线观看黑人| 超清av在线| 精品国产二区在线| 国产精品三上| 一级黄色性视频| 欧美系列在线观看| 午夜激情视频在线| 亚洲永久免费观看| 欧美欧美全黄| 亚洲中文字幕无码一区| 婷婷开心激情综合| 国产中文在线| 国产日韩精品视频| 这里只有精品在线| 日本精品一二三| 欧美日韩美女在线观看| 九色蝌蚪在线| 91精品久久久久久久久久久久久| 亚洲女同一区| 国产伦精品一区二区三区精品| 精品福利在线观看| 福利片在线看| 亚洲free性xxxx护士hd| 影音先锋久久精品| 亚洲天堂久久新| 3d动漫精品啪啪一区二区竹菊 | 亚洲免费在线看| 日本精品一二区| 国产成人精品久久久| 久久网站免费观看| 麻豆短视频在线观看| 一本到高清视频免费精品| 在线播放日本| 国产亚洲精品久久飘花| 日韩国产欧美在线观看| 欧美成人三级视频| 亚洲女人被黑人巨大进入al| 日本欧美在线| 亚洲人精品午夜射精日韩| 国产精品免费免费| www.久久综合| 国产精品高潮呻吟久久av无限| 欧美黄在线观看| 久久久久久久毛片| 日韩精品中文字幕在线不卡尤物| 日本蜜桃在线观看视频| 国产精品h视频| 久久久一区二区| 亚洲精品久久久狠狠狠爱 | 日韩精品一区不卡|