我正在尝试创建简单的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 服务器现在根本没有 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 :(得分:1)
在jetty-9中,许多签名因服务器的连接方式而改变。在拥有所有getter和setter的leu中,它被切换到更多构造函数,所以你应该找到传递线程池的能力。至于线程的预启动,请随时在RT / Jetty下的bugs.eclipse.org上打开该功能的bug,我们将看看。
另外,我们在git for jetty-9中有一个jetty-http-spi实现,但我们还没有为它发布任何工件。我们有他们7和8,我们只是试图根据它出现的要求来衡量它是否值得为jetty-9保留。那里的类扩展了你上面提到的com.sun http服务器,并允许你使用jetty代替捆绑在里面的那个,所以这是另一个潜在的选择,尽管你仍然有线程池线程启动问题我不喜欢乍一看,我们认为这是一个特别困难的问题。
答案 1 :(得分:0)
1)我找到了在Jetty中调整线程池的方法:
Server server = new Server(80);
QueuedThreadPool p = (QueuedThreadPool) server.getThreadPool();
p.setMaxThreads(1012);
2)此外,它还可以在Jetty和com.sun.http中控制TCP会话 Jetty :只需将标题连接:关闭添加到响应中,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");