[英]Performance: com.sun.net.httpserver.HttpServer vs. jetty
[英]Jetty thread pool and sun.HttpServer session
我正在嘗試創建簡單的Java HTTP服務器(也是,我也是))),但是我需要控制線程池和TCP會話。 我想在啟動時預先創建所有需要的線程,並且還需要從HTTP處理程序中關閉TCP會話。
首先,我嘗試嵌入Jetty。 Jetty 8 Server類具有setThreadPool方法,盡管其ThreadPool功能不如標准功能強大(例如,Jetty的ThreadPoolExecutor沒有prestartAllCoreThreads (我不能使用Java的ThreadPoolExecutor ,可以嗎?)。
但是似乎我可以通過servlet處理程序關閉TCP會話
HttpSession session = request.getSession();
session.invalidate();
但是,Jetty 9 Server現在根本沒有setThreadPool方法。 它遷移到其他地方了嗎?
其次,我嘗試使用com.sun.net.httpserver.HttpServer 。 與線程池配合使用效果很好
ThreadPoolExecutor thp = (ThreadPoolExecutor) Executors.newCachedThreadPool();
thp.setMaximumPoolSize(1000);
thp.setCorePoolSize(1000);
thp.prestartAllCoreThreads();
server.setExecutor(thp);
但無法控制TCP連接關閉( HttpExchange類不提供任何方法)。
因此,實際上我需要以某種方式將Sun HttpServer的線程控制與Jetty的會話控制相結合嗎?
在Jetty 9中控制ThreadPool也會很好。
另外,如果可能的話,我寧願不要使用諸如Jetty之類的第三方組件。
謝謝。
在jetty-9中,許多簽名都改變了服務器的連接方式。 在擁有所有getter和setter的方法中,將其切換為基於更多構造函數的方法,因此您應該找到在其中傳遞線程池的功能。 至於線程的預啟動,請隨時在RT / Jetty的bugs.eclipse.org中打開該功能的錯誤,我們來看一下。
另外,我們在jetty-9的git中有一個jetty-http-spi實現,但尚未發布任何工件。 我們為7號和8號配備了它們,我們只是在嘗試根據其出現的要求來評估其是否值得保留9號碼頭。 那里的類擴展了上面提到的com.sun http服務器,並允許您使用jetty代替捆綁在其中的那個,因此這是另一個潛在的選擇,盡管您仍然遇到線程池線程啟動問題,乍一看,將其視為一個特別困難的問題。
1)我找到了在Jetty中調整線程池的方法:
Server server = new Server(80);
QueuedThreadPool p = (QueuedThreadPool) server.getThreadPool();
p.setMaxThreads(1012);
2)也可以在Jetty和com.sun.http中控制TCP會話。Jetty :僅添加標頭Connection:靠近響應,Jetty將添加此標頭並發送FIN數據包
response.setHeader("Connection", "close");
response.getWriter().println(str);
但不適用於Tansfer-Encoding:chunked ,我想這是錯誤。
com.sun.http :也可以使用
t.getRequestHeaders().add("Connection", "Close");
但是它的工作原理完全不同-它不會在響應中添加標頭,而是立即關閉TCP會話,因此在發送數據后使用它:
OutputStream os = t.getResponseBody();
os.write(str.getBytes());
t.getRequestHeaders().add("Connection", "Close");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.