2013-04-30 58 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