簡體   English   中英

碼頭線程池和sun.HttpServer會話

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM