java - Apache Camel 消息交换 - 您是否可以迭代交换以从单个消息生成多个输出文件作为交换
问题描述
我在交换机上有一条入站消息。此消息被拆分为多个出站文件。我看到的问题是只生成了最后一个文件。日志显示我们成功创建了所有不同的文件,但是,只能将单个文件写入交换,最后处理的文件?请告诉我我做错了什么骆驼。提前致谢!
设置 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.5593262,Float,GOOD 1548278598,G1.A_96BD1, 1034.9998779,浮动,好
问题是您如何从一次交换中生成多个文件?
我知道这样的东西有效,但它不符合骆驼基础设施。
ofsb.append(outFolder).append(" ").append(fileName).append(" ").append(TimeStamp()).append(".csv"); 文件 file = new File(dir, ofsb.toString()); FileWriter fileWriter = new FileWriter(file); CRLFPrintWriter out = new 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>
路由“split”接收到要拆分的消息。你可以做任何你需要的事情(比如你的充实)。在某个时刻,您使用Splitter将消息拆分为多个部分。
拆分后,您将各个消息部分(拆分器的结果)发送到另一条路线。在我的示例中,它是直接路由,但您也可以使用消息队列 ( ActiveMQ ) 或内存队列 ( Seda )。
第二条路由(“writeFiles”)只接收消息部分并将它们保存到 files。Camel的文件组件只是将消息正文写入文件。
推荐阅读
- python - Python pdfminer 未正确显示 utf-8 字符
- angular - 自动发布带有 versionNumber 的新代码 Angular4
- c# - Elmah Raise() 记录内部异常
- arrays - 如何在打字稿中定义数组中的数组?
- javascript - Angular 4-在表格中添加行
- antlr - 左递归删除
- react-native - 在 React 中尝试使用 setTimeout 调用函数来延迟
- windows-10 - cx_Freeze 错误模块 SSL 不可用 Python 3.7 Windows 10
- python - Python 类型错误:可视化只需要 1 个参数,给定 53
- javascript - 一旦抛出异常,try-catch 语句就中断 try-block