Jetty 是一個開源、基於標準、功能豐富的 Java HTTP 伺服器與 Servlet 容器,廣泛應用於 Apache Geronimo、JBoss、IBM Tivoli 等知名產品。本文深入解析其核心架構、嵌入式部署、Continuation 非阻塞機制與安全性配置。
| 特性 | 說明 |
|---|---|
| 易用性 | 支援 XML/API 配置、預設配置滿足大多數需求、嵌入式部署極少代碼 |
| 可擴展性 | 大量連線下效能穩定、Continuation 機制處理長連線、優良介面支援客製化 |
| 易嵌入性 | 設計為優良組件、無需修改應用程式即可嵌入、可視為嵌入式 Web 伺服器 |
WAR 部署:將 WAR 放入 webapps 目錄,執行 java -jar start.jar,預設連接埠 8080。
嵌入式程式碼啟動:
public class JettyServer {
public static void main(String[] args) {
Server server = new Server(8080);
server.setHandler(new DefaultHandler());
try {
XmlConfiguration configuration = new XmlConfiguration(
new FileInputStream("etc/jetty.xml"));
configuration.configure(server);
server.start();
server.join(); // 等待伺服器關閉
} catch (Exception e) {
e.printStackTrace();
}
}
}
啟動流程:start.jar 讀取 jetty.xml → XmlConfiguration 使用反射配置 Server → 添加 HttpListener、HttpContext、WebApplication 等組件。
傳統 Servlet 每請求佔用一執行緒,長連線 (Comet) 易導致執行緒耗盡。Jetty 利用 java.nio 非阻塞 I/O 實作 Continuation:
public class ChatContinuation extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) {
postMessage(request, response);
}
private void postMessage(HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession(true);
People people = (People) session.getAttribute(session.getId());
if (!people.hasEvent()) {
// 取得 Continuation 並暫停 1 秒
Continuation continuation = ContinuationSupport.getContinuation(request, this);
people.setContinuation(continuation);
continuation.suspend(1000); // 執行緒釋放,可處理其他請求
}
people.setContinuation(null);
people.sendEvent(response); // 有事件時回應
}
}
private void postMessage(HttpServletRequest request, HttpServletResponse response) {
// ...
while (!people.hasEvent()) {
Thread.sleep(1000); // 執行緒持續佔用,無法處理其他請求
}
// ...
}
SelectChannelConnector (基於 java.nio)suspend() 拋出 RetryRequest 運行時異常SelectChannelConnector 捕獲resume() 觸發 → 請求重新提交 Servlet → 正常執行# 啟動指定停止埠與密碼
java -DSTOP.PORT=8079 -DSTOP.KEY=mypassword -jar start.jar
# 關閉指令需提供密碼
java -DSTOP.PORT=8079 -DSTOP.KEY=mypassword -jar start.jar --stop
Jetty 以輕量、易嵌入、高併發著稱,Continuation 機制完美解決 Web 2.0/Ajax 長連線效能瓶頸,是現代 Java Web 應用的優秀選擇。