使用 Apache Camel FTP 将文件内容和名称下载到列表中
Download file contents and names into a List with Apache Camel FTP
我想下载 Apache Camel 中包含名称和内容的文件列表。
目前我正在下载所有文件的文件内容作为byte[]并将它们存储在一个列表中。然后我使用 ConsumerTemplate 读取列表。
这很好用。这是我的路线:
from(downloadUri)
.aggregate(AggregationStrategies.flexible(byte[].class).accumulateInCollection(
LinkedList.class))
.constant(true)
.completionFromBatchConsumer()
.to("direct:" + this.destinationObjectId);
我根据需要将所有下载文件内容的列表作为 byte[]。
我现在想扩展它,以便它下载每个文件的内容和文件名。它应存储在一对对象中:
public class NameContentPair {
private String fileName;
private byte[] fileContent;
public NameContentPair(String fileName, byte[] fileContent) { ... }
}
每个下载文件的这些配对对象应依次存储在列表中。我如何更改或扩展我的路线来执行此操作?
我尝试了 Camel 转换器,但无法将它们正确构建到我的路线中。我总是把路线设置错了。
我通过实施自定义 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);
我想下载 Apache Camel 中包含名称和内容的文件列表。
目前我正在下载所有文件的文件内容作为byte[]并将它们存储在一个列表中。然后我使用 ConsumerTemplate 读取列表。 这很好用。这是我的路线:
from(downloadUri)
.aggregate(AggregationStrategies.flexible(byte[].class).accumulateInCollection(
LinkedList.class))
.constant(true)
.completionFromBatchConsumer()
.to("direct:" + this.destinationObjectId);
我根据需要将所有下载文件内容的列表作为 byte[]。
我现在想扩展它,以便它下载每个文件的内容和文件名。它应存储在一对对象中:
public class NameContentPair {
private String fileName;
private byte[] fileContent;
public NameContentPair(String fileName, byte[] fileContent) { ... }
}
每个下载文件的这些配对对象应依次存储在列表中。我如何更改或扩展我的路线来执行此操作?
我尝试了 Camel 转换器,但无法将它们正确构建到我的路线中。我总是把路线设置错了。
我通过实施自定义 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);