Почему в camel-jetty всего 2 рабочих потока?
Это статья не отвечает на вопрос в заголовке, а просто уточняет суть этого вопроса, поэтому все кто знает ответ, пишите комментарии. Жду просветления в этом вопросе...
Итак, что же я имею ввиду:
Все началось с того что в одном из проектов начали падать тесты.
Тесты делают 2 вещи:
1. Отправляют на определенный url post-запрос и ждут ответа. Но ждут не бесконечно, а только определенное время. И этого времени стало не хватать. Складывалось ощущение что сервер просто не успевал обработать запрос.
2. Выводят лог с ответом.
Решено было смоделировать ситуацию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.ProducerTemplate; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.jetty.JettyHttpComponent; import org.apache.camel.impl.DefaultCamelContext; public class App { public static void main(String[] args) { ProducerTemplate pt1 = initJettyServer(); ProducerTemplate pt2 = initDirectClient(); Sender s1 = new Sender(pt2, 1); Sender s2 = new Sender(pt2, 2); Sender s3 = new Sender(pt2, 3); Thread t1 = new Thread(s1); Thread t2 = new Thread(s2); Thread t3 = new Thread(s3); t1.start(); t2.start(); t3.start(); } private static ProducerTemplate initJettyServer() { CamelContext cc = new DefaultCamelContext(); try { cc.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { JettyHttpComponent jhc = getContext().getComponent("jetty", JettyHttpComponent.class); System.out.println(jhc.getHttpClientMinThreads()); System.out.println(jhc.getMinThreads()); System.out.println(jhc.getContinuationTimeout()); System.out.println(jhc.getHttpClient().getConnectTimeout()); System.out.println(jhc.getHttpClient().getIdleTimeout()); System.out.println(jhc.getHttpClient().getMaxConnectionsPerAddress()); System.out.println(jhc.getHttpClient().getMaxQueueSizePerAddress()); System.out.println(jhc.getHttpClient().getTimeout()); System.out.println(jhc.getHttpClient().isConnectBlocking()); System.out.println(jhc.getHttpClient().getThreadPool().getThreads()); System.out.println(jhc.getHttpClient().getMaxBuffers()); System.out.println(jhc.getHttpClient().getRequestBufferSize()); System.out.println(jhc.getHttpClient().getResponseBufferSize()); from(jhc.createEndpoint("http://127.0.0.1:8888/?matchOnUriPrefix=true")) .setHeader(Exchange.HTTP_PROTOCOL_VERSION, simple("HTTP/1.1")) .setHeader(Exchange.CONTENT_TYPE, simple("text/html;charset=utf-8")) .process(new Processor() { @Override public void process(Exchange exchange) throws Exception { String result = ""; for (int i = 0; i < 100; i++) { result += i; Thread.sleep(100); } exchange.getOut().setBody(result); } }); } }); cc.start(); } catch (Exception e) { e.printStackTrace(); } return cc.createProducerTemplate(); } private static ProducerTemplate initDirectClient() { CamelContext cc = new DefaultCamelContext(); try { cc.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("direct:test").to("http://127.0.0.1:8888"); } }); cc.start(); } catch (Exception e) { e.printStackTrace(); } return cc.createProducerTemplate(); } } |
Вывод показался мне довольно странным:
1371133961277:1:0:01234567891011121314151617181920...
1371133961279:3:0:01234567891011121314151617181920...
1371133971285:2:0:01234567891011121314151617181920...
1371133971288:1:1:01234567891011121314151617181920...
1371133981294:2:1:01234567891011121314151617181920...
1371133981296:3:1:01234567891011121314151617181920...
...
Формат вывода <время в миллисекундах>:<номер потока>:<номер запроса>
Т.е. одновременно успевают обрабатываются только запросы от 2-х потоков. Остальные потоки ждут. Были перепробованы все возможные настройки компонента camel-jetty, но увеличить количество потоков так и не получилось. Довольно странное поведение компонента.
Тестирование проводилось на camel-jetty 2.8.5 и 2.10.0