我手头有种情况,我需要从目录中读取并在那里处理所有XML文件。然后根据某些规则处理和拆分文件,从而产生N个新消息/文件。我想将所有新文档聚合到一个索引文件中,每个文件一行。处理完该批处理后,我将调用一个Web服务,并告诉它获取索引文件。
我面临的问题是Camel没有将文件的交付视为一项工作,并且我的聚合被多次调用,导致多个索引文件而不是一个。我尝试使用Exchange.BATCH_SIZE
属性并将其乘以Exchange.SPLIT_SIZE
进行聚集completionSize
伪代码:
from("file://" + SOURCE_FOLDER)
.threads(10)
.convertBodyTo(Data.class)
.process(myProcessor)
.split(xpath(MAIN_NODE))
.parallelProcessing()
.to(MyRouter.ENDPOINT)
.setProperty(TOTAL)
.spel(String.format("%s * %s", Exchange.SPLIT_SIZE, FileRouter.NUM_FILES))
.aggregate(constant(true), myAggregator)
....
所以问题是:如何定义交换/分组的边界? 我知道一次只能发送1个文件,但是我怎么能告诉骆驼呢?
我尝试仅使用1个线程,但是在我看来,这没有影响。
我可以选择将交货作为tar.gz到达-这样会更容易吗?在我看来,我也会遇到同样的问题。
from("file://" + SOURCE_FOLDER + "/tar.gz?consumer.delay=1000&noop=true")
.streamCaching()
.unmarshal()
.gzip()
.split(new TarSplitter())
....<SAME ISSUE>
尽管我也尝试使用最新的2.x版本,但我仍在使用Camel 3 Preview。
最先感谢,
答案 0 :(得分:0)
我对您的理解正确,您的问题是您无法为每个输入文件创建汇总索引。
好吧,骆驼 Splitter EIP可以与aggregation strategy 结合使用。
如果执行此操作,拆分器会将先前拆分的邮件的所有部分重新汇总为新的汇总。
// a Splitter with an AggregationStrategy
.split([yourSplitCriteria], new MyAggregationStrategy())
// you can do whatever you want in here with the message parts
// for example each splitted message part is sent to this bean
.to("bean:PartProcessor")
// end the split to re-aggregate the message parts
.end()
// here, after the split-ending you get the re-aggregated messages