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中,引入了異步請求處理。在一個典型的程序中,使用ServletInputStream來循環讀取。
但是如果輸入的數據被阻塞或者流速很慢,則服務線程必須等待數據進來。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處理。
添加修改了幾個新的接口和類,如IO的事件監聽器 -ReadListener WriteListener.
修改了ServletInputStream、ServletOutputStream。
通過ServletInputStream.setReadListener和ServletOutputStream.setWriteListener可以注冊監聽器。監聽器中提供了一些回調方法,在數據可以讀寫時進行觸發調用。
新增加的ServletInputStream.isReady方法和ServletInputStream.isFinished方法用于檢測非阻塞I/O的讀取狀態,而ServletOutputStream.canWrite方法用于檢測數據是否能夠無阻塞地寫入。
改進后的doGet方法一般如下所示:
AsyncContext context = request.startAsync(); ServletInputStream input = request.getInputStream(); input.setReadListener(new MyReadListener(input, context));示例實現
@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(); }上述實現有三處回調:
– onDataAvailable方法在數據可以無阻塞讀取的時候進行調用。
– onAllDataRead方法在當前請求已經完全讀取完畢的時候調用。
– onError方法在處理請求出錯的時候調用。
總結
以上是生活随笔為你收集整理的JAVA Web Servlet中的异步处理 (2) -- Servlet3.1中的Non-blocking IO支持的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SRE重要理念之SLA、SLO、SLI
- 下一篇: Tomcat中实现websocket和b