【问题标题】:Jetty 9 ignoring my config XMLJetty 9 忽略我的配置 XML
【发布时间】:2013-12-09 13:49:55
【问题描述】:

我在一个项目中使用 Jetty-Runner,最近升级到 Jetty 9。使用新配置迁移 XML 后,我在启动日志中注意到以下行:

WARN:oejx.XmlConfiguration:main: Ignored arg: ...

被忽略的 arg 几乎是我的整个 XML,即:

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN"     
"http://www.eclipse.org/jetty/configure.dtd">
<Configure id="Server" class="org.eclipse.jetty.server.Server">
  <Arg name="threadpool">
    <New class="org.eclipse.jetty.util.thread.QueuedThreadPool">
      <Arg name="maxThreads">200</Arg>
      <Arg name="minThreads">50</Arg>
      <Arg name="idleTimeout">1000</Arg>
      <Arg name="queue">
        <New class="java.util.concurrent.ArrayBlockingQueue">
          <Arg type="int">6000</Arg>
        </New>
      </Arg>
      <Set name="detailedDump">false</Set>
    </New>
  </Arg>
</Configure>

我已经使用当前的 Jetty Javadocs 检查了每个参数名称/类型/设置器,但仍然无法理解此设置有什么问题,请忽略。

你能帮忙吗?

【问题讨论】:

    标签: jetty embedded-jetty


    【解决方案1】:

    更新:2018 年 2 月

    Ignored arg: 表示您有一个&lt;Arg&gt; 未被用于&lt;Configure&gt;(或&lt;New&gt;)中引用的对象的构造函数。最可能的原因是您试图更改之前已经设置的内容。

    如果您在这里是因为您想更改线程池,请继续阅读。

    如果您只想配置QueuedThreadPool,您可以选择。

    推荐选择:使用jetty-homejetty-distribution 启动Jetty? 在${jetty.base} 目录中配置线程属性值。 您可以在 ${jetty.base}/start.ini${jetty.base}/start.d/*.ini 文件中找到它们。

    不使用jetty-homejetty-distribution,但仍在使用XML? 为什么?(真的,我们很想知道!)

    XML &lt;Get&gt; 方法更适合在现有线程池上设置值。

    示例(from Jetty 9.2.20,相同的as Jetty 9.4.8):

    <Configure id="Server" class="org.eclipse.jetty.server.Server">
    
    ...
    
        <Get name="ThreadPool">
          <Set name="minThreads" type="int">10</Set>
          <Set name="maxThreads" type="int">200</Set>
          <Set name="idleTimeout" type="int">60000</Set>
          <Set name="detailedDump">false</Set>
        </Get>
    

    如果您想从QueuedThreadPool 更改为其他内容,这被视为极端专家 级别的选项。您必须意识到这将对您的服务器产生的影响。

    在更改最小/最大线程时,请注意以下几点:

    • 您拥有的 CPU 内核数。 (这会影响所需的最低线程数)
    • 您拥有的网络接口数。 (这会影响所需的最低线程数)
    • 您将拥有的同时连接数。 (这会影响所需的最低线程数)
    • 您将同时拥有的请求数。 (这会影响所需的最低线程数)
    • 使用 HTTP/2 将显着增加您的线程需求。
    • 使用老式 Servlet 阻塞 API 会增加您的线程需求。 (考虑使用较新的 AsyncContext 和 Async I/O 行为,它会显着降低您的线程需求)

    一些最小线程示例:

    以下示例仅用于说明目的,并不代表来自 Jetty 项目的“推荐”值集。 Jetty 推荐值是 Jetty 中已经存在的默认值。

    在 Intel i7 上,具有 1 个网络接口,服务于普通网页,具有资源(图像、css、javascript 等)。您将需要(8 个用于 cpu 内核,1 个用于网络接口,1 个用于接受器,1 个用于选择器,以及大约 10 个用于将网页及其资源提供给典型的现代 Chrome 浏览器)大约 22 个最少线程。

    在具有 1 个网络接口的 Raspberry Pi 上,按顺序(从不并行)向单个 REST 客户端提供 REST 请求,您至少需要 8 个线程。

    更多说明:

    另外,不要假设 1 个线程 == 1 个请求/响应交换。在 Jetty 上并非如此。 [1...n] 个线程可以在其生命周期内处理单个请求/响应交换。只有使用旧式 Servlet API 阻塞读/写才会持有一个线程(同样,使用新的 Servlet API 异步 I/O 操作)

    如果您想在 Jetty 上减少流量/请求的某些假设下调整线程配置,请考虑使用QoSFilter(用于控制端点/资源特定行为)或DoSFilter(用于控制总体负载限制)而是。

    旧答案(自 2013 年 12 月起)

    1) 修复您的 DTD

    你的:

    <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN"     
    "http://www.eclipse.org/jetty/configure.dtd">
    

    Jetty 9+ 的正确方法

    <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" 
    "http://www.eclipse.org/jetty/configure_9_0.dtd">
    

    2) 更好地使用type属性

    旧版本的 Jetty 不支持 type="int",因为 "int" 不是有效的对象类型。请改用java.lang.Integer(或升级到支持"int" 的较新版本的Jetty)

    试试这个吧。

    <Arg name="threadpool">
      <New id="threadpool" class="org.eclipse.jetty.util.thread.QueuedThreadPool">
        <Arg type="java.lang.Integer" name="maxThreads">200</Arg>
        <Arg type="java.lang.Integer" name="minThreads">50</Arg>
        <Arg type="java.lang.Integer" name="idleTimeout">1000</Arg>
        <Arg name="queue">
          <New class="java.util.concurrent.ArrayBlockingQueue">
            <Arg type="java.lang.Integer">6000</Arg>
          </New>
        </Arg>
        <Set name="detailedDump">false</Set>
      </New>
    </Arg>
    

    以上内容已通过jetty-9.1.0.v20131115 分发验证。

    【讨论】:

    • 操作!谢谢修复,但消息仍然存在。
    • 在您的问题中包含完整的错误/警告消息,不要修剪或缩写它。
    • 整个 Jetty IoC XML 内容可能也是解决您的问题所必需的。
    • 至于完整的错误/警告消息,这里是:2013-12-09 13:18:29.320:WARN:oejx.XmlConfiguration:main: Ignored arg: | 200501000| 6000| false|
    • 检查 Jetty 的源代码,我注意到该消息来自与已创建对象一起使用的“Arg”标签(似乎是这种情况,因为我已经有一个服务器)。也许这意味着我只能用“new Server(...)”在 Java 代码中设置线程池?不幸的是,当前建议的 XML 也不起作用。
    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 2018-11-10
    相关资源
    最近更新 更多