Jetty REST API动态调整QueuedThreadPool maxThreads

时间:2016-02-10 12:23:01

标签: spring rest jetty

从jetty配置中设置最小/最大线程很容易:

<Configure id="server" class="org.eclipse.jetty.server.Server">   
<Set name="threadPool">
    <New class="org.eclipse.jetty.util.thread.QueuedThreadPool">
      <Set name="minThreads">10</Set>
      <Set name="maxThreads">1000</Set>
    </New>
</Set> 
</Configure>

我使用Spring并且我有一个REST端点:

@RequestMapping("/setMaxThreads")
public void setMaxThreads(...) {
    ...
}

如何访问Server / ThreadPool对象以调整其参数?

P.S。我知道任何解决方案都可能不会非常通用,因为这些是特定于实现的参数。

1 个答案:

答案 0 :(得分:0)

您甚至无法在jetty.xml示例中执行您所描述的内容。

Jetty ThreadPool的{​​{1}}现在只设置via its constructor。 它在运行期间无法调整。

  

Server.setThreadPool(ThreadPool)构造函数的这种更改发生在Jetty 9.x的开头,并且是为了解决Servlet 3.1和HTTP / 2支持的线程池需求。

原因是Server在初始化这些图层时会被注入到其他几十个图层中,ThreadPool启动LifeCycle

时会更多

如果您的目标是对线程池大小的上限进行某种过早优化?

立即停止。

从Servlet 3.0开始,绑定(上限)线程池对公共可访问的Jetty服务器完全没有意义。

你打开自己的琐碎的DoS攻击,选择器处理失败,死连接,看似随机的EOF异常等......

不要优化线程池上端,然后期望Jetty处理高负载情况。

在高负载情况下,Server峰值(暂时)达到20,000甚至50,000个活动线程并不罕见。当服务器负载消退时,QueuedThreadPool正在管理的线程数也会减少。如果需要,QueuedThreadPool将快速增加线程数,但是故意计量从池中删除线程。

如果您是一个在非常受控制的小负载情况下运行Jetty,那么可以直接用您自己的声明直接替换QueuedThreadPool。我们建议您使用ExecutorThreadPool,其中QueuedThreadPool实施您自己的选择。

ExecutorThreadPool示例:

java.util.concurrent.ExecutorService