Java ApacheCamel消息交换—您是否可以在交换上迭代以从Exchange中的单个消息生成多个输出文件
我在exchange上有一条入站邮件。此邮件被拆分为多个出站文件。我看到的问题是,只生成最后一个文件。日志显示,我们成功创建了所有不同的文件,但是,只能将单个文件写入exchange,最后一个文件是否已处理?请告诉我我做错了什么。提前谢谢 设置CamelFileName或Exchange.FILLE\u名称 通过将特定文件的内容放置在ArrayList中,将单个文件拆分为多个文件的逻辑。Java ApacheCamel消息交换—您是否可以在交换上迭代以从Exchange中的单个消息生成多个输出文件,java,file,split,apache-camel,Java,File,Split,Apache Camel,我在exchange上有一条入站邮件。此邮件被拆分为多个出站文件。我看到的问题是,只生成最后一个文件。日志显示,我们成功创建了所有不同的文件,但是,只能将单个文件写入exchange,最后一个文件是否已处理?请告诉我我做错了什么。提前谢谢 设置CamelFileName或Exchange.FILLE\u名称 通过将特定文件的内容放置在ArrayList中,将单个文件拆分为多个文件的逻辑。 log.info(“为当前资产创建输出文件:“+asset+”,文件名:“+fileName”); Str
log.info(“为当前资产创建输出文件:“+asset+”,文件名:“+fileName”);
StringBuilder ofsb=新的StringBuilder();
append(outFolder).append(“”).append(文件名).append(“”).append(时间戳()).append(.csv”);
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
DataOutputStream out=新的DataOutputStream(BAS);
用于(字符串行:serviceRecords){
out.writeBytes(行+系统.lineSeparator());
}
out.flush();
log.info(“*****serviceRecords”+”文件名:“+fileName+”*****”);
迭代器pitr=serviceRecords.Iterator()//获取阵列列表中的现有服务记录
while(pitr.hasNext()){
String sRecord=pitr.next();
log.info(pitr.next());
}
setHeader(“CamelFileName”,of sb.toString())//CamelFileName Exchange.FILE\u名称
log.info(“资产文件名:”+exchange.getOut().getHeader(“CamelFileName”));
exchange.getOut().setBody(baos.toByteArray());
baos.close();
out.close();
serviceRecords=新的ArrayList();
sb=新的StringBuilder();
ofsb=新的StringBuilder();
}
基于exchange上的单个入站文件生成并写入文件系统的多个文件
这是输入文件的一个示例:前一个流程收集所有资产关系,标记映射到资产。属于特定资产的所有标记都在集合中生成。资产集合放在ArrayList中。它遍历与此输入文件相关的所有资产,为每个唯一的资产集合创建一个输出文件
1548278588,G1.A96BD11027.8129883,浮球,良好
1548278590,G1.A96BD11046.7722168,浮球,良好
1548278591,G1.A96BD11037.0013428,浮球,良好
1548278596,G1.A96BD11046.5593262,浮球,良好
1548278598,G1.A96BD11034.9998779,浮球,良好
问题是如何从单个EXCHANGE生成多个文件???
我知道这样做是可行的,但它不符合camel infra。ofsb.append(outFolder).append(“”).append(文件名).append(“”).append(时间戳()).append(.csv”); File File=新文件(dir,ofsb.toString()); FileWriter FileWriter=新的FileWriter(文件); CRLFPrintWriter out=新的CRLFPrintWriter(fileWriter); 对于(字符串输出行: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
}
out.flush();
out.close();
fileWriter.close();
serviceRecords=新的ArrayList()//重置serviceRecords输出记录的记录列表
sb=新的StringBuilder()//重置记录生成器
ofsb=新的StringBuilder()//重置文件名
}
----Camel-XML的漏洞
<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”接收要拆分的消息。你可以做任何你需要的事(比如你的充实)。在某一点上,您可以使用将消息拆分为多个部分
<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>
拆分后,将单个消息部分(拆分器的结果)发送到另一个路由。在我的示例中,它是一个直接路由,但也可以使用消息队列()或内存队列()
第二条路径(“writeFiles”)只接收消息部分并将它们保存到文件中。只需将消息体写入文件 什么是
资产
,服务记录
。。。?您的输入消息是什么样子的?请提供更多详细信息/代码。另外,您还可以提供骆驼路线代码吗?还有,什么是TimeStamp()
?什么图书馆?此文件名不一定是唯一的.append(outFolder).append(“”).append(fileName).append(“”).append(TimeStamp()).append(.csv”)特别是当TimeStamp()
是以秒为单位的时间时。asset是我在要处理的文件中调用标记的名称。TimeStamp正是它声称的名称。是,该文件是唯一的。要在文件中进行的每个资产集合的文件名和时间戳更改。一个产生时间戳的方法也许我问这个问题不是很好。如何从exchange上的单个文件生成多个文件。一个交换可以被分成几块吗?这在exchange上是可能的吗?谢谢Burki,需要重写代码,但我明白了,谢谢againI已经更改了代码以创建列表列表。然后尝试拆分此列表。但是,我在拆分列表时遇到了问题。您可以使用JavaBean来实现拆分器逻辑。如果标准拆分器不能完成您想要的任务,您可以用bean告诉他如何拆分消息的有效负载。有关示例,请参见此处: