Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过jetty 9 Maven插件中的jetty.xml设置队列限制_Java_Jetty_Maven Jetty Plugin - Fatal编程技术网

Java 通过jetty 9 Maven插件中的jetty.xml设置队列限制

Java 通过jetty 9 Maven插件中的jetty.xml设置队列限制,java,jetty,maven-jetty-plugin,Java,Jetty,Maven Jetty Plugin,默认情况下,Jetty中的线程池在线程池填满后使用无界队列实现。我想限制排队的人数。BlockingArrayQueue有一个构造函数,它接受一个maxCapacity值,但我看不到使用jetty.xml调用它的方法。从Jetty 9开始,org.eclipse.Jetty.server.server中没有线程池的setter,我只能获得一个对已经实例化和修改过的线程池的引用(请参阅)。QueuedThreadPool中队列字段的setter抛出一个UnsupportedOperationExc

默认情况下,Jetty中的线程池在线程池填满后使用无界队列实现。我想限制排队的人数。
BlockingArrayQueue
有一个构造函数,它接受一个
maxCapacity
值,但我看不到使用jetty.xml调用它的方法。从Jetty 9开始,
org.eclipse.Jetty.server.server
中没有线程池的setter,我只能获得一个对已经实例化和修改过的线程池的引用(请参阅)。
QueuedThreadPool
中队列字段的setter抛出一个
UnsupportedOperationException
,表示使用构造函数注入。但是,如果我只能修改线程池,而不能在服务器实例上设置一个新的线程池,那么这是不可能的。尝试将线程池定义为构造函数arg会产生以下警告:

2014-09-22 13:15:13.688:警告:oejx.XmlConfiguration:main:Ignored arg:| 200501000 | 6000 | false |

这是Jetty Maven插件v9.2.2.v20140723的一部分。以下是my pom.xml中的配置:

    <configuration>
      <jettyXml>${basedir}/jetty.xml</jettyXml>
      <stopKey>x</stopKey>
      <stopPort>7999</stopPort>
      <requestLog implementation="org.eclipse.jetty.server.NCSARequestLog">
        <append>true</append>
      </requestLog>
      <webApp>
        <war>${basedir}/target/app</war>
        <contextPath>/app</contextPath>
      </webApp>
      <scanTargets>
        <scanTarget>${basedir}/src/main/webapp/WEB-INF/</scanTarget>
      </scanTargets>
      <reload>manual</reload>
    </configuration>

${basedir}/jetty.xml
x
7999
真的
${basedir}/target/app
/应用程序
${basedir}/src/main/webapp/WEB-INF/
手册

更新:不幸的是,服务器构造函数是如何配置线程池的。这超出了jetty maven插件的范围


Jetty 9中的线程池现在已在实例中设置

使用XML,您可以重新配置它,甚至更方便

请随意更改它,只需注意,如果限制太小,绑定线程池会导致问题

这是一个方便的餐巾配方

最大线程数=((cpu核心数)*4)*(连接器数))+(最大并发请求数)

实际上,即使在稍微繁忙的服务器上,400以下的大多数值也会给您带来问题。不要认为这句话意味着400是一个很好的起点,这对您来说是非常不合适的,您需要测试、监视并不断调整,直到您为您的服务器找到满意的价值。(不要忘记测试负载峰值,以及数据库出现故障时会发生什么情况)

认为您需要为性能设置一个上限,这是一种错误

Jetty使用的QueuedThreadPool确实是未绑定的,但它也会随着时间的推移清理自身并从池中删除线程,从而允许服务器处理突发负载,并在负载减少时退出

如果您关心它的内存或其他资源,请知道默认的Jetty安装即使在Android 2.3(姜饼)(注意:Jetty 7 w/QTP)、Android 4.4(Jetty 9)和Raspberry Pi(Jetty 7到9)上也可以正常运行

最后,如何设置接受队列大小

配置(通常在中找到)

40

默认值为
0
,并与调用中最低级别的
backlog
参数相关。

更新:服务器构造函数是如何配置线程池的,很遗憾。这超出了jetty maven插件的范围


Jetty 9中的线程池现在已在实例中设置

使用XML,您可以重新配置它,甚至更方便

请随意更改它,只需注意,如果限制太小,绑定线程池会导致问题

这是一个方便的餐巾配方

最大线程数=((cpu核心数)*4)*(连接器数))+(最大并发请求数)

实际上,即使在稍微繁忙的服务器上,400以下的大多数值也会给您带来问题。不要认为这句话意味着400是一个很好的起点,这对您来说是非常不合适的,您需要测试、监视并不断调整,直到您为您的服务器找到满意的价值。(不要忘记测试负载峰值,以及数据库出现故障时会发生什么情况)

认为您需要为性能设置一个上限,这是一种错误

Jetty使用的QueuedThreadPool确实是未绑定的,但它也会随着时间的推移清理自身并从池中删除线程,从而允许服务器处理突发负载,并在负载减少时退出

如果您关心它的内存或其他资源,请知道默认的Jetty安装即使在Android 2.3(姜饼)(注意:Jetty 7 w/QTP)、Android 4.4(Jetty 9)和Raspberry Pi(Jetty 7到9)上也可以正常运行

最后,如何设置接受队列大小

配置(通常在中找到)

40

默认值是
0
,它与调用中最低级别的
backlog
参数有关。

我们遇到了一个类似的问题,在中,我们希望服务器在所有线程都忙时拒绝请求,而不是无限期地排队

我认为这是一个真正的问题,以下是方法

因为无法覆盖Jetty服务器中的默认池大小或类型。我们编写了一个定制的ServerConnector,您可以在其中设置队列大小或执行器

jetty.addServerCustomizers((Server server) -> {
    LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue< (maxQueueSize);
    ExecutorService exceutorService =
        new ThreadPoolExecutor(minThreads, maxThreads, 1,
            TimeUnit.HOURS, queue);

    // extract host and port from existing connector...
    String host = "0.0.0.0";
    int port = 1900;
    for (Connector c : server.getConnectors()) {
        if (c instanceof ServerConnector) {
            host = ((ServerConnector) c).getHost();
            port = ((ServerConnector) c).getPort();
        }
    }


    ServerConnector connector = new ServerConnector(server, exceutorService, null, null, -1, -1, new HttpConnectionFactory());
    connector.setHost(host);
    connector.setPort(port);
    server.setConnectors(new Connector[] { connector });
}
jetty.addServerCustomizers((服务器)->{
LinkedBlockingQueue队列=新LinkedBlockingQueue<(maxQueueSize);
执行器服务exceutorService=
新的线程池执行器(minThreads、maxThreads、1、,
时间单位(小时、队列);
//从现有连接器中提取主机和端口。。。
字符串host=“0.0.0.0”;
int端口=1900;
对于(连接器c:server.getConnectors()){
if(服务器连接器的c实例){
主机=((服务器连接器)c).getHost();
端口=((服务器连接器)c).getPort();
}
}
ServerConnector连接器=新的ServerConnector(服务器,ExcutorService,null,null,-1,-1,新的HttpConnectionFactory());
connector.setHost(主机);
连接器。设置端口(端口);
server.setConnectors(新的