2014-03-01 1 views
1

테이블에서 여러 행을 가져온 다음 내 프로세서에서 처리하려고하지만 낙타가 모든 행에 대해 내 프로세서를 호출하고 있음을 확인합니다. 전달하려는 엔티티 목록낙타의 프로세서로 여러 jpa 엔티티를 처리하는 방법

다음

프로세서

LoanRequest lr = exchange.getIn().getBody(LoanRequest.class); 

에 내 코드

from("jpa:com.pns.ab.model.LoanRequest?consumeDelete=false" 
      + "&consumer.delay=20000" 
      + "&consumer.namedQuery=selectLoanRequests" 
      + "&persistenceUnit=LoanServicePU").process(new JpaProcessor()); 

하지만 내가 원하는 옵션

같은개
List<LoanRequest> requests = exchange.... 

감사합니다,

답변

7

는 애그리 게이터 (aggregator)를 사용 : 애그리 게이터 (aggregator)에 대한

private static class JpaAggregationRouteBuilder extends RouteBuilder { 
    @Override 
    public void configure() { 
     from("jpa:com.pns.ab.model.LoanRequest?consumeDelete=false" 
      + "&consumer.delay=20000" 
      + "&consumer.namedQuery=selectLoanRequests" 
      + "&persistenceUnit=LoanServicePU") 
       .aggregate(constant(true), new ArrayListAggregationStrategy()) 
       .completionFromBatchConsumer() 
       .process(new JpaProcessor()); 
    } 
} 

// Simply combines Exchange body values into an ArrayList<Object> 
// Taken from http://camel.apache.org/aggregator2 
private static class ArrayListAggregationStrategy implements AggregationStrategy { 

    @SuppressWarnings("unchecked") 
    @Override 
    public Exchange aggregate(final Exchange oldExchange, final Exchange newExchange) { 
     final Object newBody = newExchange.getIn().getBody(); 
     ArrayList<Object> list = null; 
     if (oldExchange == null) { 
      list = new ArrayList<Object>(); 
      if (newBody != null) { 
       list.add(newBody); 
      } 
      newExchange.getIn().setBody(list); 
      return newExchange; 
     } else { 
      list = oldExchange.getIn().getBody(ArrayList.class); 
      if (newBody != null) { 
       list.add(newBody); 
      } 
      return oldExchange; 
     } 
    } 

} 

더 많은 정보가 Camel webpage에서 찾을 수 있습니다.

관련 문제