国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 服務器 > Web服務器 > 正文

Tomcat怎么實現異步Servlet

2024-09-01 13:49:59
字體:
來源:轉載
供稿:網友

有時Servlet在生成響應報文前必須等待某些耗時的操作,比如在等待一個可用的JDBC連接或等待一個遠程Web服務的響應。對于這種情況servlet規范中定義了異步處理方式,由于Servlet中等待阻塞會導致Web容器整體的處理能力低下,所以對于比較耗時的操作可以放置到另外一個線程中進行處理,此過程保留連接的請求和響應對象,在處理完成之后可以把處理的結果通知到客戶端。

下面先看Servlet在同步情況下的處理過程,如圖所示,Tomcat的客戶端請求由管道處理最后會通過Wrapper容器的管道,這時它會調Servlet實例的service方法進行邏輯處理,處理完后響應客戶端,整個處理由Tomcat的Executor線程池的線程處理,而線程池的最大線程數使有限制的,所以這個處理過程越短、越快把線程讓回線程池就越好。但如果Servlet中的處理邏輯耗時越長就會導致長期地占用Tomcat的處理線程池,影響Tomcat的整體處理能力。

tomcat,異步servlet,servlet異步請求

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

tomcat,異步servlet,servlet異步請求

再結合一個簡單的異步代碼來看Tomcat對Servlet異步的實現:

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();  }}

我們創建一個AsyncServlet,它定義了一個userExecutor線程池專門用于處理該Servlet的所有請求的耗時的邏輯操作。這樣就不會占用Tomcat內部的Executor線程池,影響到對其他Servlet的處理。這種思想有點像資源隔離,耗時的操作統一由指定的線程池處理,而不要影響其它耗時少的請求處理。

Servlet的異步的實現就很好理解了,startAsync方法其實就是創建了一個異步上下文AsyncContext對象,該對象封裝了請求和響應對象。然后創建一個任務用于處理耗時邏輯,后面通過AsyncContext對象獲得響應對象并對客戶端響應,輸出“done!”。完成后要通過complete方法告訴Tomcat內部我已經處理完,Tomcat就會請求對象和響應對象進行回收處理或關閉連接。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 龙泉市| 古浪县| 科技| 晋宁县| 宁蒗| 苏州市| 五华县| 苍溪县| 贵溪市| 越西县| 天水市| 泽州县| 二手房| 成武县| 增城市| 珠海市| 通辽市| 昂仁县| 郧西县| 女性| 枣强县| 金川县| 吕梁市| 聊城市| 宝兴县| 康乐县| 玛沁县| 尼玛县| 平罗县| 乐昌市| 临漳县| 彰化市| 柘城县| 雷波县| 江都市| 噶尔县| 囊谦县| 祁连县| 西林县| 珠海市| 来安县|