用于多个文件处理的骆驼

时间:2019-05-09 19:36:04

标签: apache-camel

我是骆驼的新朋友。我将使用骆驼进行文件处理,但是我没有找到适合我的情况的解决方案。如果它们存在,我必须一起处理多个文件。这些文件会延迟上传到特定的文件夹(例如:我们有两个文件A.csv和B.csv,而A.csv的上传时间比B.csv晚10秒,反之亦然)。另外,如果缺席一个文件超过特定时间,我只需要处理一个文件。有人可以帮助我选择一种模式吗?据我了解,我可以使用骆驼过滤器来确保我们已经有了这两个文件A.csv和B.csv,然后才开始处理,但这并不能解决我的问题。

1 个答案:

答案 0 :(得分:1)

这是Aggregator EIP

from("file:inputFolder")
        .aggregate(constant(true), AggregationStrategies.groupedExchange())
        .completionSize(2) //Wait for two files
        .completionTimeout(60000) //Or process single file, if completionSize was not fulfilled within one minute
            .to("log:do_something") //Here you can access List<Exchange> from message body

要对消息进行分组,可以使用相关性Expression。对于您的示例(按_前的文件名前缀对消息进行分组)可能是这样的:

private final Expression CORRELATION_EXPRESSION = new Expression() {
    @Override
    public <T> T evaluate(Exchange exchange, Class<T> type) {
        final String fileName = exchange.getIn().getHeader(Exchange.FILE_NAME, String.class);
        final String correlationExpression = fileName.substring(0, fileName.indexOf('_'));
        return exchange.getContext().getTypeConverter().convertTo(
                type,
                correlationExpression
        );
    }
};

并将其传递给Aggregator

from("file:inputDirectory")
    .aggregate(CORRELATION_EXPRESSION, AggregationStrategies.groupedExchange())
    ...

有关完整示例https://gist.github.com/bedlaj/a2a56aa9291bced8c0a8edebacaf22b0

,请参见此要点