2017-10-21 15 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アドレスファイル:Exchange内EmployeeDetailsBeanIODataFormatオブジェクトで

1 city1 1234 
2 city2 2345 

予想される出力:

1 Foo Engineer [email protected] city1 1234 
2 Bar AssistantEngineer [email protected] city2 2345 

各ファイルは、オブジェクト

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に変換されて、私は次のルートに

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"); 

を持つ出力が正しくBeanオブジェクトをログに記録します。

ここで、オブジェクトをマージしてEmployeeDetailsオブジェクトを作成する必要があります。誰かが私にこれをする方法を教えてもらえますか?私は読んでいて、アグリゲータはこの仕事をするのに使うことができるようですが、そのアプローチではわかりません。

これに関するサンプルは参考になります。 提案を歓迎します。最初に従業員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にヘッダーとして格納されます。同じID(1又は2)

  • completionSize = 3を持つすべてのメッセージを相関単純( "$ {body.id}"): 最も重要なパラメータは、次

    1. correlationExpressionあります。各ファイルに1つ。 ( "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は1つずつ印刷されます。しかし、私は最後の出力をExchange本体にEmployeeDetails []する必要があるので、最終的なリストを処理してAvro形式に変換するために次のルートに渡すことができます。もう一度集約する必要がありますか? ...... completionSize(3).to( "seda" formList ")?この作業のようなものか、すべてのメッセージをグループ化するためのオプションがあります。 – jack

    +0

    もう一度集計できます(これは別の質問です)。 setBody(ヘッダ( "詳細"))。骨材(新しいGroupedExchangeAggregationStrategy())(真)。定数.complet ionSize(2)2は、IDS – ltsallas

    関連する問題