骆驼:处理文件,拆分和汇总

时间:2019-05-26 05:44:58

标签: apache-camel

我手头有种情况,我需要从目录中读取并在那里处理所有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。

最先感谢,

1 个答案:

答案 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