成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

17.13 非阻塞 I/O

Luosunce / 472人閱讀

摘要:異步模式處理請求時,提供支持和的。服務方法首先通過調用請求對象的方法將請求置于異步模式,這是使用非阻塞所必需的。

應用程序的web容器通常為每一個客戶端請求分配一個服務端線程。開發(fā)可擴展的web應用,你必須確保關聯請求的線程是沒有空閑的,不需要等待一個阻塞操作完成。異步處理提供了在一個新線程處理阻塞操作的機制,把關聯請求的線程返回給容器。即使你所有的阻塞操作都在service方法中異步執(zhí)行,關聯客戶端請求的線程基于input/output也可能出于暫時空閑狀態(tài)。
例如,如果一個客戶端在一個很慢的網絡連接上提交一個大的HTTP POST請求,server讀取請求的速度比客戶端上傳的速度快很多。使用TIO,容器關聯請求的線程有時會出于空閑狀態(tài),因為要等待客戶端的請求的其余部分。
JAVA EE異步模式處理請求時,提供支持servlet和filter的NIO。下面的步驟總結了在service方法中如何使用NIO處理請求和寫出響應:

1. 如 Asynchronous Processing章節(jié)描述,把請求設置為異步模式  
2. 在service方法中從請求和響應對象中獲得一個請求流或一個響應流
3. 分配給請求流一個監(jiān)聽器或者分配給響應流一個監(jiān)聽器 
4. 在監(jiān)聽器的回調方法中處理請求和響應
NIO 支持類 javax.servlet.ServletInputStream

方法簽名:void setReadListener(ReadListener rl)
描述:將輸入流與包含回調方法的監(jiān)聽器對象關聯,以異步讀取數據。提供的監(jiān)聽器對象可以是一個匿名類或者使用其他的機制給監(jiān)聽器對象傳入輸入流。
方法簽名:boolean isReady()
方法描述:如果數據可以無阻塞讀取,返回true
方法簽名:boolean isFinished()
方法描述:當所有數據讀取完畢后,返回true

NIO 支持類 javax.servlet.ServletOutputStream

方法簽名:void setWriteListener(WriteListener wl)
方法描述:將此輸出流與包含回調方法的偵聽器對象關聯,以異步寫入數據。
您將寫入偵聽器對象提供為匿名類,或使用其他機制將輸出流傳遞給寫入偵聽器對象。
方法簽名:boolean isReady()
方法描述:如果數據可以無阻塞寫入,返回true

NIO監(jiān)聽器支持接口

接口名稱:ReadListener
接口方法:void onDataAvailable()、void onAllDataRead()、void onError(Throwable t)
描述:ServletInputStream當數據可以有效讀取、當數據讀取完畢、當發(fā)生一個錯誤時調用監(jiān)聽器的這些方法。
接口名稱:WriteListener
接口方法:void onWritePossible()、void onError(Throwable t)
描述:ServletOutputStream當數據可以無阻塞讀取、當發(fā)生一個錯誤時調用監(jiān)聽器的這些方法。

使用NIO讀取大的HTTP POST請求

本節(jié)代碼展示了在servlet對象中怎么讀取一個大的HTTP POST數據,通過把請求放入異步模式中并使用NIO功能。

@WebServlet(urlPatterns={"/asyncioservlet"}, asyncSupported=true)
public class AsyncIOServlet extends HttpServlet {
   @Override
   public void doPost(HttpServletRequest request, 
                      HttpServletResponse response)
                      throws IOException {
      final AsyncContext acontext = request.startAsync();
      final ServletInputStream input = request.getInputStream();
      
      input.setReadListener(new ReadListener() {
         byte buffer[] = new byte[4*1024];
         StringBuilder sbuilder = new StringBuilder();
         @Override
         public void onDataAvailable() {
            try {
               do {
                  int length = input.read(buffer);
                  sbuilder.append(new String(buffer, 0, length));
               } while(input.isReady());
            } catch (IOException ex) { ... }
         }
         @Override
         public void onAllDataRead() {
            try {
               acontext.getResponse().getWriter()
                                     .write("...the response...");
            } catch (IOException ex) { ... }
            acontext.complete();
         }
         @Override
         public void onError(Throwable t) { ... }
      });
   }
}

此示例使用@WebServlet批注參數asyncSupported = true聲明具有異步支持的Web Servlet。服務方法首先通過調用請求對象的startAsync()方法將請求置于異步模式,這是使用非阻塞I / O所必需的。然后,服務方法獲得與請求相關聯的輸入流,并分配定義為內部類的讀取偵聽器。偵聽器在可用時讀取部分請求,然后在完成讀取請求時將一些響應寫入客戶端。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/74325.html

相關文章

  • Nodejs高性能原理(上) --- 異步阻塞事件驅動模型

    摘要:使用了一個事件驅動非阻塞式的模型,使其輕量又高效。的包管理器,是全球最大的開源庫生態(tài)系統。按照這個定義,之前所述的阻塞,非阻塞,多路復用信號驅動都屬于同步。 系列文章 Nodejs高性能原理(上) --- 異步非阻塞事件驅動模型Nodejs高性能原理(下) --- 事件循環(huán)詳解 前言 終于開始我nodejs的博客生涯了,先從基本的原理講起.以前寫過一篇瀏覽器執(zhí)行機制的文章,和nodej...

    yy736044583 評論0 收藏0
  • 物聯網高并發(fā)編程之網絡編程中的I/O模型

    摘要:缺點每個連接需要獨立的進程線程單獨處理,當并發(fā)請求量大時為了維護程序,內存線程切換開銷較大,這種模型在實際生產中很少使用。而在系統下,才引入,目前并不完善,因此在下實現高并發(fā)網絡編程時都是以復用模型模式為主。 思維導圖 showImg(https://segmentfault.com/img/bVbkrNz?w=1766&h=994); 互聯網服務端處理網絡請求的原理 首先看看一個典型...

    hsluoyz 評論0 收藏0
  • nginx、swoole高并發(fā)原理初探

    摘要:一閱前熱身為了更加形象的說明同步異步阻塞非阻塞,我們以小明去買奶茶為例。等奶茶做好了,店員喊一聲小明,奶茶好了,然后小明去取奶茶。將響應結果發(fā)給相應的連接請求處理完成因為基于,所以每個可以處理無數個連接請求。如此,就輕松的處理了高并發(fā)。 一、閱前熱身 為了更加形象的說明同步異步、阻塞非阻塞,我們以小明去買奶茶為例。 1、同步與異步 ①同步與異步的理解 同步與異步的重點在消息通知的方式上...

    denson 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<