0

我正在尝试创建简单的 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 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 的会话控制结合起来?

在 Jetty 9 中控制 ThreadPool 也会很好。

另外,如果可能的话,我宁愿不要使用像 Jetty 这样的第 3 方组件。

谢谢。

4

2 回答 2

1

在 jetty-9 中,许多签名更改了服务器的连接方式。在拥有所有 getter 和 setter 的 leu 中,它被切换到更多基于构造函数的方式,因此您应该找到在那里传递线程池的能力。至于线程的预启动,请随时在 RT/Jetty 下的 bugs.eclipse.org 上为该功能打开一个错误,我们将看看。

此外,我们在 git 中为 jetty-9 提供了一个 jetty-http-spi 实现,但我们还没有为它发布任何工件。我们将它们用于 7 和 8,我们只是试图根据出现的请求来衡量它是否值得为 jetty-9 保留。那里的类​​扩展了您上面提到的 com.sun http 服务器,并允许您使用码头代替捆绑在里面的那个,所以这是另一个潜在的选择,尽管您仍然有线程池线程启动问题,我没有乍一看,这并不是一个特别难以解决的问题。

于 2013-04-30T14:03:50.997 回答
0

1)我找到了在Jetty中调整线程池的方法:

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

2) 也可以在 Jetty 和 com.sun.http Jetty中控制 TCP 会话:只需添加标头Connection: close to response,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");
于 2013-05-01T06:49:20.663 回答