2013-04-30 55 views
0

我想創建簡單的Java HTTP服務器(當然,我也是))),但是我需要控制線程池和TCP會話。我想在啓動時預先創建所有需要的線程,還需要關閉來自HTTP處理程序的TCP會話。Jetty線程池和sun.HttpServer會話

第一個我試圖嵌入碼頭。碼頭8服務器類有setThreadPool方法,雖然它的線程池比標準(例如Jetty的的ThreadPoolExecutor沒有prestartAllCoreThreads那麼強大的(我不能使用Java的的ThreadPoolExecutor,可以嗎?)。

但似乎我可以

HttpSession session = request.getSession(); 
session.invalidate(); 

但碼頭9 服務器從servlet的處理程序關閉TCP會話現在已經沒有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等第三方組件。

謝謝。

+0

「我寧願不使用第三方組件」。您正在使用'com.sun。*',這將不能保證在將來出現在JVM中。 JVM只承諾'java。*'和'javax。*'存在(Oracle,Java的新所有者和管理者,現在已經改變並刪除了Sun的引用)。您希望使用'com.sun.net.httpserver.HttpServer'很有可能在將來需要第三方下載舊版jar。可能沒有更新。 – 2013-04-30 14:13:49

+0

javax是否包含自己的「標準」servlet容器/ http服務器? – 2013-04-30 14:26:21

回答

1

在jetty-9中,許多簽名因服務器連接方式而異。在所有getter和setter的leu中,它被切換到更多的基於構造函數的地方,所以你應該能夠在那裏傳遞線程池。至於線程的啓動,請隨時在RT/Jetty下的bugs.eclipse.org上爲該功能打開一個bug,我們來看看。

另外,我們在jetty-9的git中有一個jetty-http-spi實現,但是我們沒有發佈任何工件。我們有他們的7和8,我們只是試圖衡量它的值得保留在碼頭9基於它的要求出現。其中的類擴展了上面提到的com.sun http服務器,並允許您使用jetty代替內部綁定的那個,所以這是另一個潛在選項,儘管您仍然有線程池線程啓動問題,我不介意我們並不認爲這是一個非常難以解決的問題。

+0

謝謝。 我提出了錯誤https://bugs.eclipse.org/bugs/show_bug.cgi?id=406967 – 2013-05-01 06:10:42

+0

接受一個threadPool的構造函數不帶端口號,我看不到在創建後設置端口號。這種荒謬的解決方法似乎工作:\t服務器服務器=新服務器(8080); \t ThreadPool tp = new ExecutorThreadPool(5,10,10,TimeUnit.SECONDS); \t server.setServer(new Server(tp));從碼頭關於傳輸編碼 – Jegschemesch 2013-09-03 18:26:42

0

1)我發現的方式來調整線程池碼頭:

Server server = new Server(80); 
QueuedThreadPool p = (QueuedThreadPool) server.getThreadPool(); 
p.setMaxThreads(1012); 

2)也有可能在這兩個碼頭和的com.sun控制TCP會話。HTTP 碼頭:只需添加標題連接:關閉來應對,和Jetty將這個報頭,併發送FIN數據包

response.setHeader("Connection", "close"); 
response.getWriter().println(str); 

但不與Tansfer編碼工作:分塊,我猜這是錯誤。

com.sun.http:還使用

t.getRequestHeaders().add("Connection", "Close"); 

但它的工作原理完全不同 - 它不添加頭的響應,但立即關閉TCP會話,所以用它後發送數據:

OutputStream os = t.getResponseBody(); 
os.write(str.getBytes()); 
t.getRequestHeaders().add("Connection", "Close"); 
+0

答:分塊: 「一個servlet不應該設定傳輸編碼:分塊 它是由服務器來決定是否需要分塊(甚至可) 如果請求是HTTP /1.0或SPDY,則分塊不可用,如果存在連接:關閉標題,則EOF標記消息結束,因此不需要碼頭去分塊。 因此,碼頭基本上忽略了任何傳輸編碼一個servlet集合,因爲這是一個值,只有Jetty真的知道它可能是什麼。「 – 2013-05-05 14:09:07