我正在尝试创建简单的 java HTTP 服务器(好吧,我也是))),但是我需要控制线程池和 TCP session 。我想在启动时预先创建所有需要的线程,并且还需要从 HTTP 处理程序关闭 TCP session 。
首先我尝试嵌入 Jetty。 Jetty 8 Server 类有 setThreadPool 方法,尽管它的 ThreadPool 不如标准强大(例如 Jetty 的 ThreadPoolExecutor 没有 prestartAllCoreThreads (我可以'不能使用 Java 的 ThreadPoolExecutor,可以吗?)。
但似乎我可以通过
从 servlet 处理程序关闭 TCP sessionHttpSession 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 的 session 控制?
在 Jetty 9 中控制 ThreadPool 也会很好。
此外,如果可能的话,我希望不要使用 Jetty 等第 3 方组件。
谢谢。
最佳答案
在 jetty-9 中,许多签名因服务器的连接方式而发生了变化。在拥有所有 getter 和 setter 的 leu 中,它被切换到更多基于构造函数,因此您应该找到在线程池中传递的能力。至于线程的预启动,请随时在 RT/Jetty 下的 bugs.eclipse.org 上打开该功能的错误,我们会看一下。
此外,我们在 git 中为 jetty-9 提供了 jetty-http-spi 实现,但我们尚未为其发布任何工件。我们为 7 号和 8 号准备了它们,我们只是试图根据要求它出现的请求来衡量是否值得在 jetty-9 上保留它们。那里的类扩展了你上面提到的 com.sun http 服务器,并允许你使用 jetty 代替捆绑在里面的服务器,所以这是另一个潜在的选择,尽管你仍然遇到我不知道的线程池线程启动问题乍一看,这并不是一个特别难以解决的问题。
关于java - Jetty 线程池和 sun.HttpServer session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16299981/