1

나는 데이터베이스에서 행을 읽고, 스플리터를 사용하여 분할하고, 병렬로 처리하고 데이터베이스를 집계 및 업데이트하는 경로를 구현하고 있습니다. 스플리터 경로에 입력이 하나 뿐인 경우 예상대로 작동합니다. 스플리터 모두가 병렬로 처리 할 수있다 (프로세싱을 완료하기 위해 몇 분을 복용 각) I 직접 3 메시지를 보낼 때 샘플 아파치 낙타 쪼개는 도구에 입력으로 동시 교환을 찾고

<route> 
     <from uri="direct:splitter"/> 
     <log message="batch id- $simple{header.BATCH_NUMBER}, loop index - $simple{property.CamelLoopIndex}" /> 
     <split strategyRef="aggregatorStrategy" executorServiceRef="myPool"> 
      <simple>${body}</simple> 
      <log message="batch id- $simple{header.BATCH_NUMBER}, loop index - $simple{property.CamelLoopIndex}, split index - $simple{property.CamelSplitIndex}" /> 
      <to uri="bean:gisResponseProcessor" /> 
     </split> 
    </route> 

를 코드 -. 이것을 시도 할 때, 모든 3 개의 입력에 대한 스플리터 외부의 첫 번째 로그 메시지가 즉시 인쇄됩니다. 그러나 분할 자의 로그 메시지는 3 개의 교환기가 차례로 분할되어 있음을 나타냅니다. 각 스레드의 하위 메시지는 스레드 풀을 사용합니다. 스플리터가 3 개의 입력 교환을 병렬로 분할하는 방법이 있습니까?

답변

0

seda 경로 또는 vm 경로를 사용합니다. 두 가지 모두 똑같은 일을하지만 약간 다른 용도가 있습니다. 차이점에 대한이 답변을 참조하시기 바랍니다 : camel splitter parallel processing.

당신이 직면하는 문제는 메시지를 스플리터에 병렬로 보내고 싶다는 것입니다. 따라서 메시지 1,2와 3은 병렬로 처리됩니다. 이는 seda 구성 요소를 사용하여 수행 할 수 있습니다. 구성 요소는 비동기식이므로 라우트에서 메시지를 병렬로 처리 할 수 ​​있습니다. 메시지가 MESSAGE parrallel가 처리되는 seda 컴포넌트 라우팅 처리

<route> 
    <from uri="direct:splitter"/> 
    <log message="batch id- $simple{header.BATCH_NUMBER}, loop index - $simple{property.CamelLoopIndex}" /> 
    <to uri="seda:sedaSplitter"/> 
</route> 
<route id="sedaSplitter> 
    <from uri="seda:sedaSplitter?multipleConsumers=true&amp;concurrentConsumers=16"/> 

     <split strategyRef="aggregatorStrategy" executorServiceRef="myPool"> 
      <simple>${body}</simple> 
      <log message="batch id- $simple{header.BATCH_NUMBER}, loop index - $simple{property.CamelLoopIndex}, split index - $simple{property.CamelSplitIndex}" /> 
      <to uri="bean:gisResponseProcessor" /> 
     </split> 
</route> 

참고

이 경로를보십시오. parallelProcessing="true"을 스플리터에 포함하면 스플릿의 개별 항목이 병렬로 처리되므로 더 평행하게 만들 수 있습니다.

자세한 정보가 필요하면 소리 치십시오.

+0

myPool라는 스레드 풀에서 최소 6 개 스레드를 사용할 수있다, 당신은뿐만 아니라 해당 옵션을 설정할 필요가 없습니다. –

+0

내가 제안한 경로를 시도했지만 비슷한 로그 메시지가 계속 표시됩니다. 나는 스플리터 전에 평행하게 보인다. 스플리터는 한 번에 하나의 입력 교환 만 처리 (병렬로 처리되는 많은 하위 메시지로 분할)합니다. 스플리터에 여러 입력을 병렬로 소비하려면 sedaSplitter와 같은 여러 경로를 구성해야합니까? –

0

점검`executorServiceRef`를 설정 한 다음 병렬 처리가 자동으로 암시

+0

myPool에는 30 개의 스레드가 있습니다. –

+0

이 풀은 다른 경로와 공유됩니까? –

+0

공유 풀이 아닙니다. 나는 그것이 더 명백 할 수있을 정도로 완전한 낙타의 설정으로 질문을 갱신 할 것이다. –