首页 文章

Jetty线程池和sun.HttpServer会话

提问于
浏览
0

我正在尝试创建简单的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 回答

  • 1

    在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代替捆绑在里面的那个,所以这是另一个潜在的选择,尽管你仍然有线程池线程启动问题我不喜欢乍一看,我们认为这是一个特别困难的问题 .

  • 0

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

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

    2)也可以在Jetty和com.sun.http _1514795中控制TCP会话:只需将 Headers Connection: close 添加到响应中,Jetty将添加此标头并发送FIN数据包

    response.setHeader("Connection", "close");
    response.getWriter().println(str);
    

    但不适用于 Tansfer-Encoding: chunked ,我想这是错误 .

    com.sun.http :也用

    t.getRequestHeaders().add("Connection", "Close");
    

    但它的工作原理完全不同 - 它不会为响应添加标头,而是立即关闭TCP会话,所以使用它 after 发送数据:

    OutputStream os = t.getResponseBody();
    os.write(str.getBytes());
    t.getRequestHeaders().add("Connection", "Close");
    

相关问题