摘要:異步模式處理請(qǐng)求時(shí),提供支持和的。服務(wù)方法首先通過調(diào)用請(qǐng)求對(duì)象的方法將請(qǐng)求置于異步模式,這是使用非阻塞所必需的。
應(yīng)用程序的web容器通常為每一個(gè)客戶端請(qǐng)求分配一個(gè)服務(wù)端線程。開發(fā)可擴(kuò)展的web應(yīng)用,你必須確保關(guān)聯(lián)請(qǐng)求的線程是沒有空閑的,不需要等待一個(gè)阻塞操作完成。異步處理提供了在一個(gè)新線程處理阻塞操作的機(jī)制,把關(guān)聯(lián)請(qǐng)求的線程返回給容器。即使你所有的阻塞操作都在service方法中異步執(zhí)行,關(guān)聯(lián)客戶端請(qǐng)求的線程基于input/output也可能出于暫時(shí)空閑狀態(tài)。
例如,如果一個(gè)客戶端在一個(gè)很慢的網(wǎng)絡(luò)連接上提交一個(gè)大的HTTP POST請(qǐng)求,server讀取請(qǐng)求的速度比客戶端上傳的速度快很多。使用TIO,容器關(guān)聯(lián)請(qǐng)求的線程有時(shí)會(huì)出于空閑狀態(tài),因?yàn)橐却蛻舳说恼?qǐng)求的其余部分。
JAVA EE異步模式處理請(qǐng)求時(shí),提供支持servlet和filter的NIO。下面的步驟總結(jié)了在service方法中如何使用NIO處理請(qǐng)求和寫出響應(yīng):
1. 如 Asynchronous Processing章節(jié)描述,把請(qǐng)求設(shè)置為異步模式 2. 在service方法中從請(qǐng)求和響應(yīng)對(duì)象中獲得一個(gè)請(qǐng)求流或一個(gè)響應(yīng)流 3. 分配給請(qǐng)求流一個(gè)監(jiān)聽器或者分配給響應(yīng)流一個(gè)監(jiān)聽器 4. 在監(jiān)聽器的回調(diào)方法中處理請(qǐng)求和響應(yīng)NIO 支持類 javax.servlet.ServletInputStream
方法簽名:void setReadListener(ReadListener rl)
描述:將輸入流與包含回調(diào)方法的監(jiān)聽器對(duì)象關(guān)聯(lián),以異步讀取數(shù)據(jù)。提供的監(jiān)聽器對(duì)象可以是一個(gè)匿名類或者使用其他的機(jī)制給監(jiān)聽器對(duì)象傳入輸入流。
方法簽名:boolean isReady()
方法描述:如果數(shù)據(jù)可以無阻塞讀取,返回true
方法簽名:boolean isFinished()
方法描述:當(dāng)所有數(shù)據(jù)讀取完畢后,返回true
方法簽名:void setWriteListener(WriteListener wl)
方法描述:將此輸出流與包含回調(diào)方法的偵聽器對(duì)象關(guān)聯(lián),以異步寫入數(shù)據(jù)。
您將寫入偵聽器對(duì)象提供為匿名類,或使用其他機(jī)制將輸出流傳遞給寫入偵聽器對(duì)象。
方法簽名:boolean isReady()
方法描述:如果數(shù)據(jù)可以無阻塞寫入,返回true
接口名稱:ReadListener
接口方法:void onDataAvailable()、void onAllDataRead()、void onError(Throwable t)
描述:ServletInputStream當(dāng)數(shù)據(jù)可以有效讀取、當(dāng)數(shù)據(jù)讀取完畢、當(dāng)發(fā)生一個(gè)錯(cuò)誤時(shí)調(diào)用監(jiān)聽器的這些方法。
接口名稱:WriteListener
接口方法:void onWritePossible()、void onError(Throwable t)
描述:ServletOutputStream當(dāng)數(shù)據(jù)可以無阻塞讀取、當(dāng)發(fā)生一個(gè)錯(cuò)誤時(shí)調(diào)用監(jiān)聽器的這些方法。
本節(jié)代碼展示了在servlet對(duì)象中怎么讀取一個(gè)大的HTTP POST數(shù)據(jù),通過把請(qǐng)求放入異步模式中并使用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批注參數(shù)asyncSupported = true聲明具有異步支持的Web Servlet。服務(wù)方法首先通過調(diào)用請(qǐng)求對(duì)象的startAsync()方法將請(qǐng)求置于異步模式,這是使用非阻塞I / O所必需的。然后,服務(wù)方法獲得與請(qǐng)求相關(guān)聯(lián)的輸入流,并分配定義為內(nèi)部類的讀取偵聽器。偵聽器在可用時(shí)讀取部分請(qǐng)求,然后在完成讀取請(qǐng)求時(shí)將一些響應(yīng)寫入客戶端。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/74325.html
摘要:使用了一個(gè)事件驅(qū)動(dòng)非阻塞式的模型,使其輕量又高效。的包管理器,是全球最大的開源庫生態(tài)系統(tǒng)。按照這個(gè)定義,之前所述的阻塞,非阻塞,多路復(fù)用信號(hào)驅(qū)動(dòng)都屬于同步。 系列文章 Nodejs高性能原理(上) --- 異步非阻塞事件驅(qū)動(dòng)模型Nodejs高性能原理(下) --- 事件循環(huán)詳解 前言 終于開始我nodejs的博客生涯了,先從基本的原理講起.以前寫過一篇瀏覽器執(zhí)行機(jī)制的文章,和nodej...
摘要:缺點(diǎn)每個(gè)連接需要獨(dú)立的進(jìn)程線程單獨(dú)處理,當(dāng)并發(fā)請(qǐng)求量大時(shí)為了維護(hù)程序,內(nèi)存線程切換開銷較大,這種模型在實(shí)際生產(chǎn)中很少使用。而在系統(tǒng)下,才引入,目前并不完善,因此在下實(shí)現(xiàn)高并發(fā)網(wǎng)絡(luò)編程時(shí)都是以復(fù)用模型模式為主。 思維導(dǎo)圖 showImg(https://segmentfault.com/img/bVbkrNz?w=1766&h=994); 互聯(lián)網(wǎng)服務(wù)端處理網(wǎng)絡(luò)請(qǐng)求的原理 首先看看一個(gè)典型...
摘要:一閱前熱身為了更加形象的說明同步異步阻塞非阻塞,我們以小明去買奶茶為例。等奶茶做好了,店員喊一聲小明,奶茶好了,然后小明去取奶茶。將響應(yīng)結(jié)果發(fā)給相應(yīng)的連接請(qǐng)求處理完成因?yàn)榛冢悦總€(gè)可以處理無數(shù)個(gè)連接請(qǐng)求。如此,就輕松的處理了高并發(fā)。 一、閱前熱身 為了更加形象的說明同步異步、阻塞非阻塞,我們以小明去買奶茶為例。 1、同步與異步 ①同步與異步的理解 同步與異步的重點(diǎn)在消息通知的方式上...
閱讀 2894·2021-08-20 09:37
閱讀 1618·2019-08-30 12:47
閱讀 1106·2019-08-29 13:27
閱讀 1694·2019-08-28 18:02
閱讀 758·2019-08-23 18:15
閱讀 3097·2019-08-23 16:51
閱讀 940·2019-08-23 14:13
閱讀 2159·2019-08-23 13:05