日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA Web Servlet中的异步处理 (2) -- Servlet3.1中的Non-blocking IO支持

發(fā)布時(shí)間:2023/12/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA Web Servlet中的异步处理 (2) -- Servlet3.1中的Non-blocking IO支持 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

JAVA Web Servlet中的異步處理 (2) – Servlet3.1中的Non-blocking IO支持

在servlet 3.1中,新增了non-blocking IO支持。
在servlet 3.0中,引入了異步請(qǐng)求處理。在一個(gè)典型的程序中,使用ServletInputStream來循環(huán)讀取。
但是如果輸入的數(shù)據(jù)被阻塞或者流速很慢,則服務(wù)線程必須等待數(shù)據(jù)進(jìn)來。ServletOutputStream也存在這樣的問題。

示例:

public class TestServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException { ServletInputStream input = request.getInputStream();byte[] b = new byte[1024];int len = -1;while ((len = input.read(b)) != -1) {// do something }} }

在servlet 3.1中,引入了JSR 340,添加non-blocking IO處理。
添加修改了幾個(gè)新的接口和類,如IO的事件監(jiān)聽器 -ReadListener WriteListener.
修改了ServletInputStream、ServletOutputStream。
通過ServletInputStream.setReadListener和ServletOutputStream.setWriteListener可以注冊(cè)監(jiān)聽器。監(jiān)聽器中提供了一些回調(diào)方法,在數(shù)據(jù)可以讀寫時(shí)進(jìn)行觸發(fā)調(diào)用。
新增加的ServletInputStream.isReady方法和ServletInputStream.isFinished方法用于檢測(cè)非阻塞I/O的讀取狀態(tài),而ServletOutputStream.canWrite方法用于檢測(cè)數(shù)據(jù)是否能夠無阻塞地寫入。

改進(jìn)后的doGet方法一般如下所示:

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

示例實(shí)現(xiàn)

@Override public void onDataAvailable() {try {StringBuilder sb = new StringBuilder();int len = -1;byte b[] = new byte[1024];while (input.isReady() && (len = input.read(b)) != -1) {String data = new String(b, 0, len);System.out.println("--> " + data);// do something}} catch (IOException ex) {// log it} }@Override public void onAllDataRead() {// do somethingcontext.complete(); }@Override public void onError(Throwable t) {t.printStackTrace();context.complete(); }

上述實(shí)現(xiàn)有三處回調(diào):
– onDataAvailable方法在數(shù)據(jù)可以無阻塞讀取的時(shí)候進(jìn)行調(diào)用。
– onAllDataRead方法在當(dāng)前請(qǐng)求已經(jīng)完全讀取完畢的時(shí)候調(diào)用。
– onError方法在處理請(qǐng)求出錯(cuò)的時(shí)候調(diào)用。

總結(jié)

以上是生活随笔為你收集整理的JAVA Web Servlet中的异步处理 (2) -- Servlet3.1中的Non-blocking IO支持的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。