Jetty 9忽略了我的配置XML

时间:2013-12-09 13:49:56

标签: jetty embedded-jetty

我在项目中使用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检查了每个arg名称/类型/ setter,但仍然无法理解这个设置有什么问题,需要忽略。

你能帮忙吗?

1 个答案:

答案 0 :(得分:2)

更新:2018年2月

Ignored arg:表示您的<Arg>未用于<Configure>(或<New>)中引用的对象的构造函数。最可能的原因是你试图改变之前已经设定过的东西。

如果您因为想要更改ThreadPool而来到这里,请继续阅读。

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

  

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

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

XML <Get>方法更适合在现有线程池上设置值。

示例(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中已存在的默认值。

在具有1个网络接口的英特尔i7上,提供平均网页,资源(图像,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(用于控制相反,整体负荷限制。

OLD ANSWER(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发布验证了以上内容。