JAVA Web Servlet中的异步处理 (2) -- Servlet3.1中的Non-blocking IO支持
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SRE重要理念之SLA、SLO、SLI
- 下一篇: Tomcat中实现websocket和b