2017-10-21 13 views
1

직원, 주소 및 연락처 파일을 병렬로 읽고이를 beanIO 객체로 변환하고 beanIO 객체를 병합하여 전체 employeeDetails 객체를 생성하는 데 사용합니다.Apache Camel : File to BeanIO 및 id 기반의 beanIO 객체

EMP를 파일 :

1 Foo Engineer 
2 Bar AssistantEngineer 

EMP를 연락 파일 :

1 8912345678 [email protected] 
2 7812345678 [email protected] 

EMP를 주소 파일 :

1 city1 1234 
2 city2 2345 
거래소에서 EmployeeDetailsBeanIODataFormat 객체의

예상 출력 :

1 Foo Engineer [email protected] city1 1234 
2 Bar AssistantEngineer [email protected] city2 2345 
012 3,516,

나는 다음과 같은 경로가

from("file://C:/cameltest/employee.txt").to("seda:beanIO"); 
from("file://C:/cameltest/employeeContact.txt").to("seda:beanIOContact"); 
from("file://C:/cameltest/employeeAddress.txt").to("seda:beanIOAddress"); 

각 파일이 객체에게

BeanIODataFormat empFormat = new BeanIODataFormat("beanIO.xml","emp"); 
BeanIODataFormat empContactFormat = new BeanIODataFormat("beanIO.xml", "empContact"); 
BeanIODataFormat empAddressFormat = new BeanIODataFormat("beanIO.xml", "empAddress"); 

from("seda:beanIO").unmarshal(empFormat).log("body - ${body}");   
from("seda:beanIOContact").unmarshal(empContactFormat).log("Contact body ${body}"); 
from("seda:beanIO").unmarshal(empAddressFormat).log("Address body - ${body}");  

출력은 콩이 제대로 개체 기록을 beanio로 변환되어 있습니다.

이제 개체를 병합하여 EmployeeDetails 개체를 만들어야합니다. 누군가가 어떻게하는지 알려 줄 수 있습니까? 나는이 글을 읽었으며 Aggregators가이 작업을 수행하는 데 사용될 수 있지만 접근법에는 확신이없는 것처럼 보입니다.

샘플에 대한 자세한 내용은 도움이 될 것입니다. 제안을 환영합니다. 사원 ID를 기반으로 파일을 병합하고 그 파일을 사용하여 개체를 만드는 것이 좋습니다. IO가 성능을 희생하므로 병합 된 파일을 디스크에 쓰고 싶지 않습니다.

미리 감사드립니다.

답변

1

여기에 비 정렬 화

from("seda:beanIO").unmarshal(empFormat).split(body()).to("seda:aggregate"); 
from("seda:beanIOContact").unmarshal(empContactFormat).split(body()).to("seda:aggregate"); 
from("seda:beanIOAddress").unmarshal(empAddressFormat).split(body()).to("seda:aggregate"); 

후 각 메시지를 분할하는 스플리터를 사용은 그리 게이터 모습 수있는 방법이다. 세부 개체는 olddExchange에 헤더로 저장됩니다. 가장 중요한 매개 변수는 다음

  1. correlationExpression 있습니다 : 간단한 ("$ {body.id은}") 같은 ID를 가진 모든 메시지의 상관 관계 (1 또는 2)
  2. completionSize = 3. 각 파일마다 하나씩. . ("Seda의 : 집계")에서

    집계 (단순 ("$ {body.id}"), (oldExchange, newExchange) -> {

    if (oldExchange == null) { 
         EmployeeDetails details = buildDetails(new EmployeeDetails(), newExchange); 
         newExchange.getIn().setHeader("details", details); 
         return newExchange; 
        } 
        EmployeeDetails details = oldExchange.getIn().getHeader("details", EmployeeDetails.class); 
        buildDetails(details, newExchange); 
        oldExchange.getIn().setHeader("details", details); 
        return oldExchange; 
    }).completionSize(3).log("Details - ${header.details}") 
    

그리고

private EmployeeDetails buildDetails(EmployeeDetails details, Exchange newExchange) { 
     Object newBody = newExchange.getIn().getBody(); 
     if (newBody instanceof Employee) { 
      details.setId(((Employee) newBody).getId()); 
      details.setName(((Employee) newBody).getName()); 
      details.setJob(((Employee) newBody).getJob()); 
     } else if (newBody instanceof EmployeeContact) { 
      details.setEmail(((EmployeeContact) newBody).getEmail()); 
     } else if (newBody instanceof EmployeeAddress) { 
      details.setCity(((EmployeeAddress) newBody).getCity()); 
      details.setCode(((EmployeeAddress) newBody).getCode()); 
     } 
     return details; 
    } 
그런 다음 결과는 2 개 세부 수

Details - EmployeeDetails(id=1, name=Foo, job=Engineer, [email protected], city=city1, code=1234) 
Details - EmployeeDetails(id=2, name=Bar, job=AssistantEnginee, [email protected], city=city2, code=2345) 
+0

감사 개체 것 대답을 위해, 나는 이것을 시도하고 당신에게 알려줄 것입니다. – jack

+0

잘 작동하지만 EmployeeDetails가 하나씩 인쇄됩니다. 하지만 Exchange 최종본에 EmployeeDetails []가 필요하므로 다음 경로에서 최종 목록을 처리하고 Avro 형식으로 변환 할 수 있습니다. 다시 집계해야합니까? ...... completionSize (3) .to ("seda"formList ")?이 작업과 비슷하거나 모든 메시지를 그룹화하는 옵션이 있습니다. – jack

+0

다시 집계 할 수 있습니다 (다른 질문 임). (2) 여기서 2는 ID 수입니다. – ltsallas