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