Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ApacheCamel消息交换—您是否可以在交换上迭代以从Exchange中的单个消息生成多个输出文件_Java_File_Split_Apache Camel - Fatal编程技术网

Java ApacheCamel消息交换—您是否可以在交换上迭代以从Exchange中的单个消息生成多个输出文件

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

我在exchange上有一条入站邮件。此邮件被拆分为多个出站文件。我看到的问题是,只生成最后一个文件。日志显示,我们成功创建了所有不同的文件,但是,只能将单个文件写入exchange,最后一个文件是否已处理?请告诉我我做错了什么。提前谢谢

设置CamelFileName或Exchange.FILLE\u名称

通过将特定文件的内容放置在ArrayList中,将单个文件拆分为多个文件的逻辑。

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告诉他如何拆分消息的有效负载。有关示例,请参见此处: