Jetty7釋出了,Jetty7支援servlet 2.5,且對Jetty6做了很大的重構,使之更合理更高效。
Jetty的Http異步處理模式,包括Jetty HttpClient(異步的HttpClient),Jetty Continuation(異步的Http Request/Respoinse),都是很吸引人的技術,有很多很好的應用,比如線上聊天室,實時股票行情表,異步Ajax代理等等,都可以用Jetty的異步處理模式來實作。
趁Jetty7的到來,趕緊享受一下這道技術美味。
Jetty Continuation 實際上是一種異步Http技術,他能讓Http連接配接挂起,直到逾時或者異步事件發生時,Http連接配接可以恢複。Jetty Continuation 的技術應用起來不複雜,有幾個關鍵的API,和兩種設計模式:
API:
(1) 得到Continuation
Continuation continuation = ContinuationSupport.getContinuation(request);
(2) 挂起Http請求
void doGet(HttpServletRequest request, HttpServletResponse response)
{
...
continuation.setTimeout(long); // 可選:設定continuation 逾時
continuation.suspend();
...
}
(3) 恢複Http連接配接,一旦異步事件發生了,可以通過異步事件的回調函數來恢複Http連接配接
void myAsyncCallback(Object results)
{
continuation.setAttribute("results", results);
continuation.resume();
}
(4) 完成Http連接配接,通常用在異步事件回調函數裡傳回Http Response時:
void myAsyncCallback(Object results)
{
writeResults(continuation.getServletResponse(), results); // 将異步事件結果result,通過Response傳回用戶端
continuation.complete();
}
(5)注冊異步事件處理器
myAsyncHandler.register(continuation);
(6)監聽continuation事件
void doGet(HttpServletRequest request, HttpServletResponse response)
{
...
Continuation continuation = ContinuationSupport.getContinuation(request);
continuation.addContinuationListener(new ContinuationListener()
{
public void onTimeout(Continuation continuation) { ... } // 逾時事件
public void onComplete(Continuation continuation) { ... } // 完成事件
});
continuation.suspend();
...
}
兩種設計模式:Suspend/Resume模式,Suspend/Continue模式:
(1) Suspend/Resume模式:
void doGet(HttpServletRequest request, HttpServletResponse response)
{
// 如果我們需要異步方式得到一個result,并放入request中
Object results = request.getAttribute("results");
if (results==null) // 如果異步處理尚未傳回結果
{
final Continuation continuation = ContinuationSupport.getContinuation(request);
// 判斷是否逾時
if (continuation.isExpired())
{
// 傳回逾時Response
sendMyTimeoutResponse(response);
return;
}
// 挂起HTTP連接配接
continuation.suspend();
// 注冊一個異步事件處理器
myAsyncHandler.register(new MyHandler()
{
// 異步事件
public void onMyEvent(Object result)
{
continuation.setAttribute("results", results); // 傳送results
continuation.resume(); // 恢複連接配接
}
});
return; // or continuation.undispatch();
}
// 連接配接恢複後傳回結果
sendMyResultResponse(response,results);
}
(2)Suspend/Continue模式:
void doGet(HttpServletRequest request, HttpServletResponse response)
{
final Continuation continuation = ContinuationSupport.getContinuation(request);
// 判斷是否逾時
if (continuation.isExpired())
{
// 傳回逾時Response
sendMyTimeoutResponse(response);
return;
}
// 挂起HTTP連接配接
continuation.suspend(response); // response被包裝
// 注冊一個異步事件處理器
myAsyncHandler.register(new MyHandler()
{
// 異步事件
public void onMyEvent(Object result)
{
sendMyResultResponse(continuation.getServletResponse(), results); // 通過response傳回results
continuation.complete(); // 完成
}
});
}
}