Apache Camel Message Exchange-您可以在交换中进行迭代以从交换中的单个消息中产生多个输出文件吗

时间:2019-01-28 22:37:39

标签: java file split apache-camel

我在交易所有一条入站消息。此消息分为多个出站文件。我看到的问题是仅生成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中。它遍历与此输入文件相关的所有资产,为每个唯一资产集合创建一个out文件。

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.5593262,Float,GOOD 1548278598,G1.A_96BD1,1034.9998779,Float,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
    } 

----骆驼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>

1 个答案:

答案 0 :(得分:1)

对于您要问的问题(拆分消息并将部分内容写入文件),此问题中有太多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>

路由“拆分”接收到要拆分的消息。您可以做任何您需要的事情(例如您的充实)。在某个时候,您可以使用Splitter 将邮件拆分为多个部分

拆分后,您将单个邮件部分(拆分器的结果)发送到另一条路由。在我的示例中,这是一条直接路由,但是您也可以使用消息队列(ActiveMQ)或内存队列(Seda)。

第二条路由(“ writeFiles”)仅接收消息部分,并将其保存到文件file component of Camel只是将邮件正文写入文件。