2017-05-11 8 views
0

나는 parallell 작업을 수행하기 위해 split에서 threadPool을 사용해야하는 camelRoute을 가지고 있습니다. 내 문제는 그 이유는 내가 스레드가 하나의 스레드와 스레드 풀 지정된 양의 스레드를 실행할 수 있기 때문에 항상 한 스레드를 너무 많이 끝납니다. 스레드 풀에 스레드 풀을 채우고 싶습니다.Apache Camel split이 ThreadPool을 사용하여 병렬로 실행되는 이유는 무엇입니까?

왜 이런 일이 발생하는지 누구나 알 수 있습니까? 경로 및 스레드 풀은 나의 낙타의 context.xml처럼 구성되어

from(FROM_ENDPOINT) 
    .routeId(ID) 
    .split(body(), new GroupedExchangeAggregationStrategy()) 
    .executorServiceRef("ThreadPool") 
    .bean(bean, "beanMethod") 
    .end() 
    .bean(bean) 
    .multicast() 
    .to(TO_ENDPOINT); 

(여기에서와 ID 등과 같은 코드에서 다른 값,하지만 캔트 쇼 ...) 아래 낙타 상황 ... :

<camel:camelContext id="application-context" useMDCLogging="true" xmlns="http://camel.apache.org/schema/spring"> 
    <propertyPlaceholder id="properties" location="ref:props"/> 
    <routeBuilder ref="refToRoute"/> 
    <threadPoolProfile id="ThreadPool" maxPoolSize="2" 
         maxQueueSize="-1" poolSize="2"/> 
</camel:camelContext> 

답변

3

스플리터는 병렬 작업을 조율하기 위해 하나의 배경 스레드가 필요합니다. 따라서 스레드 풀의 스레드와 이름이 Splitter-AggregateTask 인 추가 스레드가 하나 있습니다.

그래서 총 최대 값을 10으로하려면 스레드 풀 크기를 9로 설정하면 1 개의 백그라운드 스레드 공간도 확보됩니다.

+0

왜 여분의 스레드가 있는지 알려줘서 고맙습니다. 하나의 스레드 풀 값을 설정 덜 생각하지만 만약 내가 1 스레드와 함께 실행하고 싶습니다? 테스트에서 우리가 스레드 풀 로그에서 수행하는 작업으로 하나의 스레드 만 사용하는 것이 유익 할 것입니다. 우리는 순서대로보고해야하며 평행 흐름은이를 따르기가 매우 어렵습니다. 유일한 해결책은 지금은 경로에서 스레드 풀을 제거하는 것입니다. – pressbyron

+0

1 스레드의 경우 스레드 풀을 사용하지 말고 모든 스레드를 동일한 순서로 순차적으로 사용하십시오. –

+0

그래, 이해하지만 디버깅 때문에 테스트 중에는 아니지만 프로덕션 환경에서 스레드 풀을 갖고 싶습니다. 테스트/prod에 대한 두 개의 코드베이스를 원하지 않지만 테스트에서 하나의 스레드를 사용하고 생산에서 여러 개를 사용하도록 스레드 풀을 구성하려고합니다. 그러나 이것은 불가능할 수 있습니까? – pressbyron