首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Jetty 伺服器深度解析:架構特色、嵌入式部署與 Continuation 非阻塞機制

     編輯:Java 相關知識

Jetty 高效能 Web 伺服器完整技術指南

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 等組件。

Continuation 非阻塞機制:解決 Comet 長連線難題

傳統 Servlet 每請求佔用一執行緒,長連線 (Comet) 易導致執行緒耗盡。Jetty 利用 java.nio 非阻塞 I/O 實作 Continuation:

使用 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); // 有事件時回應
    }
}

不使用 Continuation 的阻塞寫法 (效能差)

private void postMessage(HttpServletRequest request, HttpServletResponse response) {
    // ...
    while (!people.hasEvent()) {
        Thread.sleep(1000); // 執行緒持續佔用,無法處理其他請求
    }
    // ...
}

Continuation 底層運作原理

  1. 需配置 SelectChannelConnector (基於 java.nio)
  2. suspend() 拋出 RetryRequest 運行時異常
  3. 異常傳播至 SelectChannelConnector 捕獲
  4. 請求放入「待決 Continuation 隊列」,HTTP 連線保持開啟
  5. 執行緒歸還執行緒池,處理其他請求
  6. 超時或 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 應用的優秀選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved