使用Apache Camel FTP将文件内容和名称下载到列表中

sirbozc5  于 2022-11-07  发布在  Apache
关注(0)|答案(1)|浏览(228)

我想下载一个文件的名称和内容在Apache Camel 列表。
目前我下载所有文件的文件内容作为byte[]并将它们存储在一个List中。然后我使用ConsumerTemplate读取列表。这很好用。这是我的路线:

from(downloadUri)
            .aggregate(AggregationStrategies.flexible(byte[].class).accumulateInCollection(
                    LinkedList.class))
            .constant(true)
            .completionFromBatchConsumer()
            .to("direct:" + this.destinationObjectId);

我得到了所有下载文件内容的列表,如所需的byte[]。
现在我想扩展它,使它下载每个文件的内容和文件名。它将存储在一个pair对象中:

public class NameContentPair {

    private String fileName;
    private byte[] fileContent;

    public NameContentPair(String fileName, byte[] fileContent) { ... }
}

每个下载文件的这些配对对象将依次存储在一个列表中。我如何更改或扩展我的路由来实现这一点?
我试过 Camel 转换器,但不能把它们正确地建立到我的路线中。我总是把路线设置错误。

bf1o4zei

bf1o4zei1#

我通过实现一个自定义的AggregationStrategy解决了这个问题。
它从每个Exchange中读取文件名和文件内容,并将它们作为NameContentPair对象放入一个列表中。文件内容和文件名作为RemoteFile出现在Exchange的主体中,并从那里读取。
常规聚合实现基于https://camel.apache.org/components/3.15.x/eips/aggregate-eip.html中的示例实现
然后将聚合策略添加到路由中

from(downloadUri)
            .aggregate(new FileContentWithFileNameInListAggregationStrategy())
            .constant(true)
            .completionFromBatchConsumer()
            .to("direct:" + this.destinationObjectId);

相关问题