AJAX 使客戶端頻繁發起短請求(輪詢/長連接),傳統同步 Servlet 每請求佔用一執行緒,極易耗盡執行緒池。WebLogic 提供 FutureResponseServlet 實現「伺服器推送/Comet」模式:單一執行緒管理成千上萬客戶端連接,釋放容器執行緒,大幅提升併發擴展性。
FutureResponseServlet,覆寫 service(HttpServletRequest, FutureServletResponse)。FutureServletResponse 註冊到共享隊列,立即返回,不佔用執行緒。flush(),維持長連接。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.servlet.FutureResponseServlet 支援,其他容器(Tomcat/Jetty)請使用 Servlet 3.0 AsyncContext 或 Comet API。| 模式 | 執行緒佔用 | 併發上限 | 適用場景 |
|---|---|---|---|
| 同步 Servlet | 1 請求 = 1 執行緒 | ~幾百 | 傳統表單、低頻 AJAX |
| FutureResponseServlet | 1 執行緒管理 N 連接 | ~數萬 | 高頻推送、即時聊天、股票行情 |
| Servlet 3.0 Async | 非阻塞 IO + 完成回調 | ~數萬 | 現代標準、跨容器可移植 |