有時servlet在生成響應報文前必須等待某些耗時的操作,比程式設計客棧如在等待乙個可用的jdbc連線或等待乙個遠端web服務的響應。對於這種情況servlet規範中定義了非同步處理方式,由於servlet中等待阻塞會導致web容器整體的處理能力低下,所以對於比較耗時的操作可以放置到另外乙個執行緒中進行處理,此過程保留連線的請求和響應物件,在處理完成之後可以把處理的結果通知到客戶端。
下面先看servlet在同步情況下的處理過程,如圖所示,tomcat的客戶端請求由管道處理最後會通過wrapper容器的管道,這時它會調servlet例項的service方法進行邏輯處理,處理完後響應客戶端,整個處理由tomcat的executor執行緒池的執行緒處理,而執行緒池的最大執行緒數使有限制的,所以這個處理過程越短、越快把執行緒讓回執行緒池就越好。但如果servlet中的處理邏輯耗時越長就會導致長期地占用tomcat的處理執行緒池,影響tomcat的整體處理能力。
為了解決上面的問題引入了支援非同步的servlet,同樣是客戶端請求到來,然後通過管道最後進入到wrapper容器的管道,呼叫servlet例項的service後,建立乙個非同步上下文將耗時的邏輯操作封裝起來,交給使用者自己定義的執行緒池,這時tomcat的處理執行緒就能馬上回到executor執行緒池,而不用等待耗時的操作完成才讓出執行緒,從而提公升了tomcat的整體處理能力。這裡要注意的是,由於後面做完耗時的操作後還需要對客戶端響應,所以需要保持住request和response物件,以便輸出響應報文到客戶端。
再結合乙個簡單的非同步**來看tomcat對servlet非同步的實現:
}}我們建立乙個asyncservlet,它定義了乙個userexecutor執行緒池專門用於處理該servlet的所有請求的耗時的邏輯操作。這樣就不會占用tomcat內部的executor執行緒池,影響到對其他servlet的處理。這種思想有點像資源隔離,耗時的操作統一由指定的執行緒池處理,而不要影響其它耗時少的請求處理。
servlet的非同步的實現就很好理解了,startasync方法其實就是建立了乙個非同步上下文asynccontext物件,該物件封裝了請求和響應物件。然後建立乙個任務用於處理耗時邏輯,後面通過asynccontext物件獲得響應物件並對客戶端響應,輸出「done!」。完成後要通過complete方法告訴tomcat內部我已經處理完,tomcat就會請求物件和響應物件進行**處理或關閉連線。
本文標題: tomcat怎麼實現非同步servlet
本文位址: /jiqiao/fuwuqi/175540.html
Tomcat怎麼實現非同步Servlet
有時servlet在生成響應報文前必須等待某些耗時的操作,比如在等待乙個可用的jdbc連線或等待乙個遠端web服務的響應。對於這種情況servlet規範中定義了非同步處理方式,由於servlet中等待阻塞會導致web容器整體的處理能力低下,所以對於比較耗時的操作可以放置到另外乙個執行緒中進行處理,此...
php怎麼進行非同步程式設計,PHP如何實現非同步資料呼叫
瀏覽器和伺服器之間只有一種面向無連線的http協議進行通訊的,面向無連線的程式的特點是客戶端請求服務端,服務端根據請求返回相應的程式,不能保持持久連線。這樣就出現了乙個問題,乙個客戶端的相應服務端可能執行1秒也有可能執行1分鐘,這樣瀏覽器就會一直處於等待狀態,如果程式執行緩慢,使用者可能就沒耐心關掉...
實踐,用tornado實現自定義協議server
因為想讓 盡量少,所以委託模式沒有嚴格按照設計模式的規範寫,直接忽略掉了inte ce的定義.嚴格來說是需要定義inte ce和判斷傳入引數的型別的 泛華 這是類的例項關係圖 也不知道是不是這樣畫.詳情見 myserverconnection.server request loop gen.coro...