Почему в camel-jetty всего 2 рабочих потока?

Написано 13 Июнь, 2013 в категории Java,Разработка ПО

Это статья не отвечает на вопрос в заголовке, а просто уточняет суть этого вопроса, поэтому все кто знает ответ, пишите комментарии. Жду просветления в этом вопросе...

Итак, что же я имею ввиду:
Все началось с того что в одном из проектов начали падать тесты.
Тесты делают 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