我创建了许多 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] 删除。
我来说两句