从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。我知道任何解决方案都可能不会非常通用,因为这些是特定于实现的参数。
答案 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