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

異步 Servlet 擴展 AJAX 應用:WebLogic FutureResponseServlet 實戰

     編輯:關於JSP

AJAX 使客戶端頻繁發起短請求(輪詢/長連接),傳統同步 Servlet 每請求佔用一執行緒,極易耗盡執行緒池。WebLogic 提供 FutureResponseServlet 實現「伺服器推送/Comet」模式:單一執行緒管理成千上萬客戶端連接,釋放容器執行緒,大幅提升併發擴展性。

核心原理

  • 繼承 FutureResponseServlet,覆寫 service(HttpServletRequest, FutureServletResponse)。
  • 請求到達時,將 FutureServletResponse 註冊到共享隊列,立即返回,不佔用執行緒。
  • 獨立「通知執行緒」從隊列取出響應對象,異步寫入資料並 flush(),維持長連接。
  • 客戶端(AJAX/Applet)保持連接接收流式資料,無需輪詢。

完整範例:時間推送服務

public class AsyncTimeServlet extends FutureResponseServlet {
  private final Notifier notifier = new Notifier();

  @Override
  public void service(HttpServletRequest req, FutureServletResponse resp)
      throws IOException, ServletException {
    notifier.poll(req, resp);  // 註冊並即時返回
  }

  class Notifier extends Thread {
    private final Stack<Client> clients = new Stack<>();

    void poll(HttpServletRequest req, FutureServletResponse resp) {
      clients.push(new Client(req, resp));
    }

    @Override
    public void run() {
      while (!clients.empty()) {
        Client c = null;
        try {
          c = clients.pop();
          PrintWriter pw = c.resp.getWriter();
          for (int i = 0; i < 10; i++) {
            pw.println("Time: " + new Date());
            pw.flush();                 // 關鍵:推送到瀏覽器
            Thread.sleep(1000);
          }
          pw.close();
        } catch (Throwable t) {
          t.printStackTrace();
        } finally {
          try { c.resp.send(); } catch (IOException ignored) {}
        }
      }
    }
  }

  static class Client {
    final HttpServletRequest req;
    final FutureServletResponse resp;
    Client(HttpServletRequest r, FutureServletResponse rs) { req = r; resp = rs; }
  }
}

部署要點

  • web.xml 註冊 Servlet,<load-on-startup>1</load-on-startup> 確保啟動即啟動通知執行緒。
  • 生產環境建議用 執行緒池 替代單一 Notifier,按事件類型分派處理。
  • 需啟用 WebLogic weblogic.servlet.FutureResponseServlet 支援,其他容器(Tomcat/Jetty)請使用 Servlet 3.0 AsyncContext 或 Comet API。

效能對比

掌握異步 Servlet 是構建高併發即時 Web 應用的核心技能,建議新專案直接採用 Servlet 3.0+ 標準 API。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
模式執行緒佔用併發上限適用場景
同步 Servlet1 請求 = 1 執行緒~幾百傳統表單、低頻 AJAX
FutureResponseServlet1 執行緒管理 N 連接~數萬高頻推送、即時聊天、股票行情
Servlet 3.0 Async非阻塞 IO + 完成回調~數萬現代標準、跨容器可移植