簡體   English   中英

Apache Camel消息交換-您可以在交換上進行迭代以從交換中的單個消息生成多個輸出文件

[英]Apache Camel Message Exchange - can you iterate over the exchange to produce multiple output files from a single message on in exchange

我在交換中只有一條入站消息。 此消息分為多個出站文件。 我看到的問題是僅生成LAST文件。 日志顯示我們成功創建了所有不同的文件,但是,只能將單個文件寫入交換,對LAST文件進行處理嗎? 請告訴我我在做錯駱駝。 提前致謝!

設置CamelFileName或Exchange.FILLE_NAME

通過將特定文件的內容放置在ArrayList中,將單個文件拆分為多個文件的邏輯。 ...

    log.info("Create output file for current asset: " + asset + " with fileName: " + fileName);
    StringBuilder ofsb = new StringBuilder();
    ofsb.append(outFolder).append("_").append(fileName).append("_").append(TimeStamp()).append(".csv");

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    DataOutputStream out = new DataOutputStream(baos);
    for (String row : serviceRecords) {
        out.writeBytes(row + System.lineSeparator());
    }
    out.flush();

      log.info("**** serviceRecords  " + " file name: " + fileName + "****");
      Iterator<String> pitr = serviceRecords.iterator(); //get the existing service records in array list
      while ( pitr.hasNext()) {
          String sRecord = pitr.next(); 
          log.info(pitr.next());
      }
    exchange.getOut().setHeader("CamelFileName", ofsb.toString());  //CamelFileName Exchange.FILE_NAME
    log.info("Asset File Name: " + exchange.getOut().getHeader("CamelFileName"));
    exchange.getOut().setBody(baos.toByteArray());
    baos.close();
    out.close();
    serviceRecords = new ArrayList<String>();
    sb = new StringBuilder();   
    ofsb = new StringBuilder(); 
    } 

交換時基於單個入站文件生成並寫入文件系統的多個文件。

這是輸入文件的示例:以前的過程收集所有資產關系,將標記映射到資產。 屬於特定資產的所有標簽都放入一個集合中。 資產集合放在ArrayList中。 它遍歷與此輸入文件相關的所有資產,為每個唯一資產集合創建一個輸出文件。

1548278588,G1.A_96BD1,1027.8129883,Float,GOOD 1548278590,G1.A_96BD1,1046.7722168,Float,GOOD 1548278591,G1.A_96BD1,1037.0013428,Float,GOOD 1548278596,G1.A_96BD1,1046.5GO262,Float 1034.9998779,浮動,GOOD

問題是如何從單個交換中生成多個文件?

我知道類似的東西行得通,但與下文的駱駝不符。
ofsb.append(outFolder).append(“ ).append( fileName).append(“ ”).append(TimeStamp())。append(“。csv”); 文件文件=新文件(dir,ofsb.toString()); FileWriter fileWriter =新的FileWriter(文件); CRLFPrintWriter out =新的CRLFPrintWriter(fileWriter); for(String outputLine:serviceRecords){// otemp,oServiceRecords,seviceRecords,osRecords out.println(outputLine); }

    out.flush();
    out.close();
    fileWriter.close();

    serviceRecords = new ArrayList<String>(); //reset serviceRecords record list of output records
    sb = new StringBuilder(); //reset record builder    
    ofsb = new StringBuilder(); //reset file name
    } 

---- Camel XML的SNIPIT

<route autoStartup="true" id="core.fleet.asset.splitterRoute">
    <from id="_from4" uri="{{fileEnrichmentEndpoint}}"/>
    <process id="_process4" ref="assetCollectorProcessor"/>
    <process id="_process5" ref="fleetAssetSplitter"/>
    <to id="_splitOut" uri="{{fileSplitDestination}}"/>
</route>

對於您提出的問題(拆分消息並將部分內容寫入文件),此問題中有太多的Java代碼。

在不詳細閱讀您的問題的情況下,這里是您問題概念性答案

<route id="split">
    <from uri="[endpoint where full message arrives]"/>
    ...
    <split ...>
        ...
    </split>
    <to uri="direct:writeFiles"/>
</route>

<route id="writeFiles">
    <from uri="direct:writeFiles"/>
    <setHeader headerName="CamelFileName">
        <simple>...</simple>
    </setHeader>
    <to uri="file:directory?option=value"/>
</route>

路由“拆分”接收到要拆分的消息。 您可以做任何您需要的事情(例如您的充實)。 在某一時刻,你使用分配器消息分成幾部分

拆分后,您將各個消息部分 (拆分器的結果)發送到另一條路由。 在我的示例中,這是一條直接路由,但是您也可以使用消息隊列( ActiveMQ )或內存隊列( Seda )。

第二條路由(“ writeFiles”)僅接收消息部分並將其保存到文件中 Camel文件組件只是將消息正文寫入文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM