2016-10-01 87 views
5

到目前爲止,因爲它適用於服務http請求,所以我認爲術語 - asynchronousnon-blocking i/o意味着同樣的事情。但顯然,它們分別在servlet 3.0和3.1中分別實現。我正在努力瞭解這裏的區別...Java - Servlet 3.0中的異步與Servlet 3.1中的NIO

請問有人可以在這個主題上多說一點嗎?具體來說,我正在尋找一個例子,說明一個服務器的servlet 3.0實現如何可以是異步的,但阻塞在一個線程上?我想如果我明白這一點,可能會更容易理解servlet 3.1中的非阻塞I/O試圖解決的確切問題。

回答

4

我會盡量總結我所學到的東西。據瞭解,Servlet的3.0和Servlet 3.1解決這個問題,讓我們來看看這樣說:

此前Servlet的3.0:
長期運行的線程導致線程匱乏。在Servlet 3.0之前,針對這些長時間運行的線程有特定於容器的解決方案,我們可以產生一個單獨的工作線程來執行繁重的任務,然後將響應返回給客戶端。在啓動工作線程後,servlet線程返回到servlet池。 Tomcat的Comet,WebLogic的FutureResponseServlet和WebSphere的Asynchronous Request Dispatcher是實現異步處理的一些例子。
(更多信息請參見link 1

的Servlet 3.0異步:
實際工作可以委託給一個線程池實現(獨立容器特定的解決方案)。 Runnable實現將執行實際處理,並將使用AsyncContext將請求分派到另一個資源或寫入響應。我們還可以將AsyncListener實現添加到AsyncContext對象以實現回調方法。
(更多信息參見link 1。)

的Servlet 3.1 NIO:
的Servlet 3.0允許異步請求處理,但只有傳統的I/O被允許。傳統I/O如何影響處理?那麼,如果進入服務器(I/O)的數據阻塞或流傳輸速度慢於服務器可讀,則服務器線程必須等待該數據。另一方面,如果數據寫入ServletOutputStream的速度較慢,則客戶端線程必須等待。此問題通過ReadListenerWriteListener接口解決。這些註冊在ServletInputStreamServletOutputStream。監聽器具有回調方法,當內容可用於讀取或者可以在沒有阻塞的情況下被寫入時,這些回調方法被調用。
(更多信息請參見link 2

現金 http://www.journaldev.com/2008/async-servlet-feature-of-servlet-3
https://blogs.oracle.com/arungupta/entry/non_blocking_i_o_using