2014-01-11 92 views

回答

6

好處不是直接關於「性能增益」。這些方法的目的是在讀取輸入(POST)數據或寫入文檔時避免請求線程(處於異步模式)阻塞。

Java EE7教程中有一個示例:"17.13.1 Reading a Large HTTP POST Request Using Non-Blocking I/O"(鏈接已更新)。

這與Tomcat在封面下使用nio是正交的。


1-有間接的性能收益。當線程可能阻塞網絡I/O時,增加吞吐量的另一種策略是增加工作線程的數量。但是這會增加內存佔用(導致更多「開銷」)。

+0

我開始閱讀有關的servlet 3.1的信息,但如何將作業發送到後臺執行,並在servlet返回inmediatly釋放容器線程,正在獲得的東西,在執行其線程itselft,所以資源並不清楚我將被消耗。 –

+0

異步的獲得利益,如果你能避免阻塞請求線程在等待類似請求到後端服務來完成。顯然,如果你正在後臺線程中做實際的工作......而不是其他機器...你沒有取得多大成就。我想你在考慮錯誤的用例。 –

+0

那麼,當另一臺服務器完成這項工作時,真正獲得它的嗎?像微服務一樣?這不是一臺服務器在做任何事情嗎?即使這個服務器是一個多層應用程序? –

8

Tomcat的讀取頭(和在一個NIO非阻塞模式這樣做) 但讀出請求機構是一個應用程序的關注,並與阻塞IO執行 (直到說明書的Servlet 3.0要求)。同樣, 寫入響應是通過阻塞IO來完成的,因爲這也是規範的要求 。

所有這些都隨Servlet 3.1而改變。

您可能希望看到email Thread這個

下面對和代碼樣本是從Java EE 7 Recipies它解釋了使用setWritelistner和setReadListner

要實現非阻塞I/O解決方案,新編程接口 已被添加到ServletInputStream和ServletOutputStream中,以及 作爲兩個事件偵聽器:ReadListener和WriteListener。 ReadListener 和WriteListener接口通過在 服務器內容可以在不阻塞的情況下讀取或寫入時調用的回調方法以非阻塞方式進行servlet I/O處理。使用 ServletInputStream.setReadList ener(ServletInputStream,AsyncContext) 方法向ServletInputStream註冊ReadListener,並使用 的I/O讀取 ServletInputStream。 setWriteListener(ServletOutputStream,AsyncContext) 註冊WriteListener的方法。代碼 以下行演示瞭如何用 ServletInputStream註冊ReadListener實現:

AsyncContext context = request.startAsync(); 
ServletInputStream input = request.getInputStream(); 
input.setReadListener(new ReadListenerImpl(input, context)); 
3

異步IO可以對在某些情況下的性能產生深遠的影響。我的經驗主要是與ASP.NET相同,但它也應該適用於此。

一個servlet具有有限數量的線程來處理請求。如果存在任何阻塞IO(網絡請求,數據庫查詢等),則處理請求的線程在等待IO完成時處於使用狀態。在高容量的情況下,這可能會導致線程池餓死並導致嚴重的性能下降。

使用異步IO,IO不會阻塞請求線程。相反,回調被註冊並隨後在IO完成時被調用。與此同時,線程返回到線程池,可以繼續處理其他請求。