我正在尝试创建简单的java HTTP服务器(好吧,我也是))),但是我需要控制线程池和TCP会话 . 我想在启动时预先创建所有需要的线程,我还需要从HTTP处理程序关闭TCP会话 .
First 我试图嵌入Jetty . Jetty 8 Server类有 setThreadPool 方法,虽然它的ThreadPool功能不如标准(例如Jetty的 ThreadPoolExecutor 没有 prestartAllCoreThreads (我可以't use Java' s ThreadPoolExecutor ,我可以吗?) .
但似乎我可以从servlet处理程序关闭TCP会话
HttpSession session = request.getSession();
session.invalidate();
但Jetty 9 Server 现在根本没有 setThreadPool 方法 . 它迁移到其他地方了吗?
Second 我试图使用 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这样的第三方组件 .
谢谢 .
2 回答
在jetty-9中,许多签名都改变了服务器的连线方式 . 在拥有所有getter和setter的leu中,它被切换到更多构造函数,因此你应该找到传递线程池的能力 . 至于线程的预启动,请随时在RT / Jetty下的bugs.eclipse.org上打开该功能的bug,我们将看看 .
另外,我们在gty for jetty-9中有一个jetty-http-spi实现,但我们还没有为它发布任何工件 . 我们有他们7和8,我们只是试图根据它出现的要求来衡量它是否值得为jetty-9保留 . 那里的类扩展了你上面提到的com.sun http服务器,并允许你使用jetty代替捆绑在里面的那个,所以这是另一个潜在的选择,尽管你仍然有线程池线程启动问题我不喜欢乍一看,我们认为这是一个特别困难的问题 .
1)我找到了在Jetty中调整线程池的方法:
2)也可以在Jetty和com.sun.http _1514795中控制TCP会话:只需将 Headers Connection: close 添加到响应中,Jetty将添加此标头并发送FIN数据包
但不适用于 Tansfer-Encoding: chunked ,我想这是错误 .
com.sun.http :也用
但它的工作原理完全不同 - 它不会为响应添加标头,而是立即关闭TCP会话,所以使用它 after 发送数据: