【问题标题】:Jetty maxes out number of ConnectorsJetty 最大化连接器的数量
【发布时间】:2021-11-03 06:59:12
【问题描述】:

我们用 Java 启动 Jetty 服务器,并有一个非常直接的过程:调用 API,启动服务器。启动 Jetty 时不会发生任何魔法,它是一个不应该依赖于任何东西的静态过程。然而,我们遇到了一些初创公司的问题,Jetty 会尝试打开(可能是无穷无尽的)连接器并最大化 ThreadPool 的大小。 OK-Runs 将只有一个服务器连接器,正如我所期望的那样,使用 4 核 CPU 并且没有设置服务器连接器计数。 我们还尝试通过设置服务器连接器的数量(为一个)来解决这个问题,但 Jetty 仍然会增加计数并且无法启动,因为没有足够的可用线程。 更奇怪的是,另一个 API 用户(不同的应用程序)从来没有遇到过这个问题。这一切都在同一台机器、同一操作系统上进行了测试,甚至通常在同一天进行。 我们使用 Jetty 9.4.38。这就是异常所说的:

无法订阅连接器 java.lang.IllegalStateException:配置线程不足:QueuedThreadPool[qtp370296980]@16124894{STARTED,8

【问题讨论】:

  • 你是如何启动 Jetty 的?
  • “我们还尝试通过将服务器连接器的数量设置为一个来解决问题”??你能再解释一下吗,你是怎么做到的? (Jetty中没有这样的设置)
  • start() 在 org.eclipse.jetty.server.Server 的实例上调用
  • 我对 Jetty 实现的理解是,除非您为服务器明确设置连接器,否则它将处理连接器。这就是我所做的,我创建了一个只有 1 个接受器和选择器的 ServerConnector,并将这个连接器分配给服务器。
  • Jetty 只有 1 个自创建的连接器场景,new Server(int port) 构造函数,Jetty 本身没有其他机制来创建连接器。如果您有 200 个连接器,那么您的代码专门添加了 200 个连接器。

标签: java http jetty


【解决方案1】:

报告的ThreadPoolBudget 表明您有一些技术和/或组件的组合需要 200 个线程的线程负载,但您的最大线程数正好是 200 个。

命名记录器 org.eclipse.jetty.util.thread.ThreadPoolBudget 的 INFO 记录的输出将报告您拥有的各种组件的租约/预算。

输出将具有指示...的格式

INFO: <component> requires <num> threads from <thread-pool>

这将告诉您哪些组件正在请求该数量的线程。

&lt;component&gt; 将包含组件的哈希码/对象标识,如果您看到相同的重复(例如:Foo@1234Foo@789 将是不同的对象实例,但 Bar@575Bar@575 会是相同的对象实例),那么您的服务器初始化错误。 (可能没有正确使用LifeCycle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 2018-07-10
    • 1970-01-01
    相关资源
    最近更新 更多