| // |
| // ======================================================================== |
| // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. |
| // ------------------------------------------------------------------------ |
| // All rights reserved. This program and the accompanying materials |
| // are made available under the terms of the Eclipse Public License v1.0 |
| // and Apache License v2.0 which accompanies this distribution. |
| // |
| // The Eclipse Public License is available at |
| // http://www.eclipse.org/legal/epl-v10.html |
| // |
| // The Apache License v2.0 is available at |
| // http://www.opensource.org/licenses/apache2.0.php |
| // |
| // You may elect to redistribute this code under either of these licenses. |
| // ======================================================================== |
| // |
| |
| package org.eclipse.jetty.server; |
| |
| import org.eclipse.jetty.util.thread.QueuedThreadPool; |
| import org.eclipse.jetty.util.thread.ThreadPool; |
| import org.junit.After; |
| import org.junit.Test; |
| |
| public class InsufficientThreadsDetectionTest { |
| |
| private Server _server; |
| |
| @After |
| public void dispose() throws Exception |
| { |
| _server.stop(); |
| } |
| |
| @Test(expected = IllegalStateException.class) |
| public void testConnectorUsesServerExecutorWithNotEnoughThreads() throws Exception |
| { |
| // server has 3 threads in the executor |
| _server = new Server(new QueuedThreadPool(3)); |
| |
| // connector will use executor from server because connectorPool is null |
| ThreadPool connectorPool = null; |
| // connector requires 7 threads(2 + 4 + 1) |
| ServerConnector connector = new ServerConnector(_server, connectorPool, null, null, 2, 4, new HttpConnectionFactory()); |
| connector.setPort(0); |
| _server.addConnector(connector); |
| |
| // should throw IllegalStateException because there are no required threads in server pool |
| _server.start(); |
| } |
| |
| @Test |
| public void testConnectorWithDedicatedExecutor() throws Exception |
| { |
| // server has 3 threads in the executor |
| _server = new Server(new QueuedThreadPool(3)); |
| |
| // connector pool has 100 threads |
| ThreadPool connectorPool = new QueuedThreadPool(100); |
| // connector requires 7 threads(2 + 4 + 1) |
| ServerConnector connector = new ServerConnector(_server, connectorPool, null, null, 2, 4, new HttpConnectionFactory()); |
| connector.setPort(0); |
| _server.addConnector(connector); |
| |
| // should not throw exception because connector uses own executor, so its threads should not be counted |
| _server.start(); |
| } |
| |
| @Test // Github issue #586 |
| public void testCaseForMultipleConnectors() throws Exception { |
| // server has 3 threads in the executor |
| _server = new Server(new QueuedThreadPool(3)); |
| |
| // first connector consumes all 3 threads from server pool |
| _server.addConnector(new ServerConnector(_server, null, null, null, 1, 1, new HttpConnectionFactory())); |
| |
| // second connect also require 3 threads but uses own executor, so its threads should not be counted |
| final QueuedThreadPool connectorPool = new QueuedThreadPool(3, 3); |
| _server.addConnector(new ServerConnector(_server, connectorPool, null, null, 1, 1, new HttpConnectionFactory())); |
| |
| // should not throw exception because limit was not overflown |
| _server.start(); |
| } |
| |
| } |