最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Tomcat怎么實(shí)現(xiàn)異步Servlet

 更新時(shí)間:2017年01月03日 10:30:20   作者:seaboat 汪洋之舟  
這篇文章主要介紹了Tomcat怎么實(shí)現(xiàn)異步Servlet,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。

有時(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é)果通知到客戶端。

下面先看Servlet在同步情況下的處理過(guò)程,如圖所示,Tomcat的客戶端請(qǐng)求由管道處理最后會(huì)通過(guò)Wrapper容器的管道,這時(shí)它會(huì)調(diào)Servlet實(shí)例的service方法進(jìn)行邏輯處理,處理完后響應(yīng)客戶端,整個(gè)處理由Tomcat的Executor線程池的線程處理,而線程池的最大線程數(shù)使有限制的,所以這個(gè)處理過(guò)程越短、越快把線程讓回線程池就越好。但如果Servlet中的處理邏輯耗時(shí)越長(zhǎng)就會(huì)導(dǎo)致長(zhǎng)期地占用Tomcat的處理線程池,影響Tomcat的整體處理能力。

 Servlet同步處理

為了解決上面的問(wèn)題引入了支持異步的Servlet,同樣是客戶端請(qǐng)求到來(lái),然后通過(guò)管道最后進(jìn)入到Wrapper容器的管道,調(diào)用Servlet實(shí)例的service后,創(chuàng)建一個(gè)異步上下文將耗時(shí)的邏輯操作封裝起來(lái),交給用戶自己定義的線程池,這時(shí)Tomcat的處理線程就能馬上回到Executor線程池,而不用等待耗時(shí)的操作完成才讓出線程,從而提升了Tomcat的整體處理能力。這里要注意的是,由于后面做完耗時(shí)的操作后還需要對(duì)客戶端響應(yīng),所以需要保持住Request和Response對(duì)象,以便輸出響應(yīng)報(bào)文到客戶端。

Servlet異步處理

再結(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線程池專門用于處理該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ì)客戶端響應(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 在Tomcat中部署Web項(xiàng)目的操作方法(必看篇)

    在Tomcat中部署Web項(xiàng)目的操作方法(必看篇)

    下面小編就為大家?guī)?lái)一篇在Tomcat中部署Web項(xiàng)目的操作方法(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Tomcat10配置端口號(hào)為443(使用https訪問(wèn))

    Tomcat10配置端口號(hào)為443(使用https訪問(wèn))

    tomcat配置好了以后默認(rèn)是使用8080端口訪問(wèn)的,本文主要介紹了Tomcat10配置端口號(hào)為443,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 詳解tomcat設(shè)置默認(rèn)路徑致使項(xiàng)目url沖突解決方法

    詳解tomcat設(shè)置默認(rèn)路徑致使項(xiàng)目url沖突解決方法

    這篇文章主要介紹了詳解tomcat設(shè)置默認(rèn)路徑致使項(xiàng)目url沖突解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • Tomcat在linux環(huán)境中開機(jī)自啟(定時(shí)重啟)的方法

    Tomcat在linux環(huán)境中開機(jī)自啟(定時(shí)重啟)的方法

    我們經(jīng)常會(huì)遇到服務(wù)器斷電或異常,而異常后tomcat中部署的web項(xiàng)目需要我手動(dòng)去啟動(dòng),為此,特別貢獻(xiàn)出Linux環(huán)境中Tomcat開機(jī)自啟的方式供學(xué)習(xí)使用,需要的朋友可以參考下
    2023-10-10
  • intelli idea中配置Tomcat找不到的解決辦法

    intelli idea中配置Tomcat找不到的解決辦法

    這篇文章主要介紹了intelli idea中配置Tomcat找不到的解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • idea搭建項(xiàng)目找不到Tomcat的解決方法(圖文教程)

    idea搭建項(xiàng)目找不到Tomcat的解決方法(圖文教程)

    今天在公司中導(dǎo)入公司項(xiàng)目,需要配置tomcat,結(jié)果發(fā)現(xiàn)找不到,所以這篇文章主要給大家介紹了關(guān)于idea搭建項(xiàng)目找不到Tomcat的解決方法,需要的朋友可以參考下
    2023-07-07
  • Tomcat體系結(jié)構(gòu)與插件配置教程圖解

    Tomcat體系結(jié)構(gòu)與插件配置教程圖解

    這篇文章主要介紹了Tomcat體系結(jié)構(gòu)與插件配置教程圖解,包括發(fā)布程序的過(guò)程和tomcat服務(wù)器體系結(jié)構(gòu),需要的朋友可以參考下
    2018-05-05
  • 詳解Tomcat是如何實(shí)現(xiàn)異步Servlet的

    詳解Tomcat是如何實(shí)現(xiàn)異步Servlet的

    這篇文章主要介紹了詳解Tomcat是如何實(shí)現(xiàn)異步Servlet的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Tomcat核心組件及應(yīng)用架構(gòu)詳解

    Tomcat核心組件及應(yīng)用架構(gòu)詳解

    眾所周知Tomcat 就是一個(gè) Servlet 容器,為了方便使用,他們具有http服務(wù)器的功能,所以Tomcat 就是一個(gè)“HTTP 服務(wù)器 + Servlet 容器”,我們也叫它們 Web 容器,今天重點(diǎn)給大家普及Tomcat核心組件及應(yīng)用架構(gòu)相關(guān)知識(shí),感興趣的朋友一起了解下吧
    2021-05-05
  • 為什么我的tomcat啟動(dòng)不起來(lái)

    為什么我的tomcat啟動(dòng)不起來(lái)

    tomcat安裝好了,準(zhǔn)備部署Web項(xiàng)目了,啟動(dòng)tomcat,發(fā)現(xiàn)沒有反應(yīng),本文就來(lái)解決一下這個(gè)問(wèn)題,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評(píng)論

湘潭市| 博兴县| 孝感市| 承德县| 三门峡市| 定边县| 古交市| 五峰| 凤庆县| 渭南市| 永靖县| 安顺市| 岑溪市| 南靖县| 嵊州市| 行唐县| 阿坝县| 沂水县| 邯郸市| 拉萨市| 铁岭县| 横山县| 榆树市| 南澳县| 大丰市| 大荔县| 扶余县| 内黄县| 延长县| 定襄县| 信宜市| 神木县| 巴里| 仪征市| 略阳县| 兰西县| 体育| 钟山县| 星座| 沙坪坝区| 新巴尔虎左旗|