使用骆驼拆分器拆分列表列表

磨坊

我创建了许多 ArrayLists 来保存要拆分为它们自己的实体的单独实体的集合。这些被添加到一个 ArrayList 然后推送到我尝试拆分列表列表的交换。我似乎无法拆分列表列表。

尝试了 Splitter 的许多变体,包括令牌等。

List<String> serviceRecords = new ArrayList<String>();  //holds an assets collection
List<String> toRecords = new ArrayList<String>();       //holds all asset collections

在收集属于一个组的项目后,它们被添加到一个 ArrayList 中。

serviceRecords.add(sb.toString());

添加完所有项目后,将列表添加到列表中。

toRecords.addAll(serviceRecords);

然后我将列表推送到交易所

exchange.getIn().setBody(toRecords);

然后是 XML 路线,它在尝试不同的事情时处于混乱状态。没有一个工作。必须有一个技巧来拆分列表列表。

    <route autoStartup="true" id="core.fleet.asset.splitterRoute">
        <from id="_from4" uri="{{fileEnrichmentEndpoint}}"/>
        <process id="_process4" ref="assetCollectorProcessor"/>
        <process id="_process5" ref="fleetAssetSplitter"/>
        <split id="FleetSplit">    <!-- strategyRef="tsAggregationStrategy" -->
        <!-- <simple>${body}</simple> -->
        <tokenize token="BLOCKMarker"/>
          <log id="splitBody" message="Split Body: ${body}"/>
          <to id="_splitOut" uri="{{fileSplitDestination}}/?fileName=GCMS_asset_${date:now:yyyyMMddhhmmss}.csv"/>
          <!-- <process id="getName" ref="fleetAssetFileName"/> -->
          <!-- <to id="_splitOut" uri="{{fileSplitDestination}}/?fileName=GCMS_asset_${date:now:yyyyMMdd}.csv"/> -->
        </split>
        <!-- <to id="_splitOut" uri="{{fileSplitDestination}}/?fileName=GCMS_asset_${date:now:yyyyMMdd}.csv"/> -->
        <stop/>
    </route>

从列表列表的拆分生成的多个文件。

磨坊

我不知道天气会删除这个还是为了其他人的兴趣而离开。
在发现我使用了错误的 List 方法 List.addAll() 而不是 List.add(object) 并进行了此更正后,我的不好,令人惊讶的是,一切都按预期的理论预期工作,在其领域内的一切都有效。

所以这很简单。您无需执行任何特殊操作即可拆分列表列表。拆分器将遍历列表并拆分出单个列表。然后,您可以掌握这些列表并处理它们并转发它们。愚蠢的我认为成熟的 Camel Splitter EIP 表现得很奇怪,它正在做它应该做的事情。

这是最终结果。(感谢 burki 和其他人的帮助)

    <route autoStartup="true" id="core.fleet.asset.splitterRoute">
        <from id="_from4" uri="{{fileEnrichmentEndpoint}}"/>
        <process id="_process4" ref="assetCollectorProcessor"/>
        <process id="_process5" ref="fleetAssetSplitter"/>
        <split id="fs1">
            <simple>${body}</simple>
            <log id="lfs1" message="Original Body: ${body}"/>
            <process id="pfs1" ref="fileSplitter" />
            <to id="seda:fs1" uri="seda:fs1"/>
        </split>
    </route>

我将文件名隐藏在位置 -0- 的内部列表列表中,因此我们只需提取文件名,设置 CamelFileName,稍微处理数据并将其发送到交换。

    log.info("File Splitter :: Start");

    List<String> pl = (List<String>) exchange.getIn().getBody(List.class);
    log.info("File Pay Load: " + pl);

    fName = pl.get(0);  //get file name
    exchange.getIn().setHeader("CamelFileName", fName);
    pl.remove(0);
    log.debug("**** serviceRecords  ****");
    Iterator<String> pitr = pl.iterator(); 
    while ( pitr.hasNext()) {
          log.debug(pitr.next());
      }
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    DataOutputStream out = new DataOutputStream(baos);
    for (String record : pl) {
        out.writeBytes(record + System.lineSeparator());
    }
    out.flush();
    exchange.getIn().setBody(baos.toByteArray());
    out.close();

    log.info("File Splitter :: Finish");

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章