厲害了,Servlet3的非同步處理機制
Servlet3釋出好幾年了,又有多少人知道它的新特性呢?下面簡單介紹下。
主要增加了以下特性:
1、非同步處理支援
2、可插性支援
3、註解支援,零配置,可不用配置web.xml
...
非同步處理是什麼鬼?
直接操起鍵盤幹。
@WebServlet(name = "index", urlPatterns = { "/" }, asyncSupported = true)
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
try {
PrintWriter out = resp.getWriter();
out.println("servlet started.<br/>");
out.flush();
AsyncContext asyncContext = req.startAsync();
asyncContext.addListener(getListener());
asyncContext.start(new IndexThread(asyncContext));
out.println("servlet end.<br/>");
out.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 非同步執行緒結果監聽
* @author javastack
* @return
*/
private AsyncListener getListener() {
return new AsyncListener() {
public void onComplete(AsyncEvent asyncEvent) throws IOException {
asyncEvent.getSuppliedResponse().getWriter().close();
System.out.println("thread completed.");
}
public void onError(AsyncEvent asyncEvent) throws IOException {
System.out.println("thread error.");
}
public void onStartAsync(AsyncEvent asyncEvent) throws IOException {
System.out.println("thread started.");
}
public void onTimeout(AsyncEvent asyncEvent) throws IOException {
System.out.println("thread timeout.");
}
};
}
}
public class IndexThread implements Runnable {
private AsyncContext asyncContext;
public IndexThread(AsyncContext asyncContext) {
this.asyncContext = asyncContext;
}
public void run() {
try {
Thread.sleep(5000);
PrintWriter out = asyncContext.getResponse().getWriter();
out.println("hello servlet3.<br/>");
out.flush();
asyncContext.complete();
} catch (Exception e) {
e.printStackTrace();
}
}
}
訪問localhost:8080/test
頁面首先輸出
servlet started.
servlet end.
過了5秒後再輸出
hello servlet3.
可以看出servlet立馬返回了,但沒有關閉響應流,只是把response響應傳給了執行緒,執行緒再繼續輸出,我們可以將比較費資源消耗時間的程式放到非同步去做,這樣很大程式上節省了servlet資源。
Springmvc3.2開始也加入了servlet3非同步處理這個特性,有興趣的同學可以去研究下。
從上面的servlet註解也可以看出來,servlet3完全解放了web.xml配置,通過註解可以完全代替web.xml配置。
相關文章
- Android中的非同步訊息處理機制Android非同步
- 深入理解Android非同步訊息處理機制Android非同步
- redis的事件處理機制Redis事件
- 厲害了!用 Python 製作出來的地球儀!Python
- 厲害了,JavaScript 新提案:array.groupBy()JavaScript
- 厲害了,ECMAScript 新提案:JSON模組JSON
- Java 的異常處理機制Java
- java中的垃圾處理機制Java
- SpringMVC異常的處理機制SpringMVC
- java異常的處理機制Java
- 異常處理機制
- 厲害了量子計算機!瞧瞧它是如何“秒殺”其他計算機計算機
- Nginx 超時事件的處理機制Nginx事件
- Flink的視窗處理機制(一)
- Java 中的異常處理機制Java
- Java——事件處理機制概要Java事件
- Java異常處理機制Java
- 微服務基礎——厲害了!API閘道器微服務API
- C#中的異常處理機制C#
- 8.異常處理機制
- 08.異常處理機制
- C++異常處理機制C++
- 厲害了!100多個API介面分享!熱門、常用的都有API
- Go語言錯誤處理機制Go
- goang 錯誤&異常處理機制Go
- mysql事務處理與鎖機制MySql
- 【進階之路】併發程式設計(三)-非阻塞同步機制程式設計
- 異常處理機制(二)之異常處理與捕獲
- 厲害了,一個更智慧的 JavaScript 對映器:array.flatMap()JavaScript
- 一種極簡的非同步超時處理機制設計與實現(C#版)非同步C#
- 厲害了,一個自動掃雷遊戲專案!遊戲
- C# 中居然也有切片語法糖,太厲害了C#
- SAP CRM WebClient UI的Delta處理機制介紹WebclientUI
- 一次ceph心跳機制異常的處理
- Netty之非阻塞處理Netty
- 非同步流程處理非同步
- 非同步處理方法非同步
- JavaScript | 非同步處理JavaScript非同步