我有一条骆驼路线,如下所示
from("activemq:queue:upload" )
.pollEnrich().simple("file:basePath/${header.ID}?noop=true&recursive=true")
.aggregationStrategy(new ExampleAggregationStrategy())
.timeout(2000)
.toD("ftp:${header.destinationURI}")
在我的文件系统file:basePath/${header.ID}
中包含多个文件夹。执行上述路由时,只将第一个文件夹中的第一个文件复制到ftp服务器。剩余的文件夹(带子文件夹)不会被复制到ftp服务器!
ExampleAggregationStrategy()
类的aggregate()
方法如下所示
@Override
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
String destinationURI = "populatedURI";
oldExchange.setOut(newExchange.getIn());
oldExchange.getOut().setHeader("ID", oldExchange.getIn().getHeader("ID"));
oldExchange.getOut().setHeader("destinationURI", destinationURI);
oldExchange.setFromEndpoint(newExchange.getFromEndpoint());
oldExchange.setFromRouteId(newExchange.getFromRouteId());
return oldExchange;
}
我也尝试过设置properties and onCompletions
。仍然没有运气!
我在aggregationStrategy
中遗漏了什么吗?
如何使用pollEnrich
成功复制所有文件和文件夹?
答案 0 :(得分:2)
我知道这是一个老问题,但我有类似的问题,我使用loopDoWhile()
来解决它。这是我的路线:
from("direct:start")
.setProperty("StartDate", simple("${date:now:yyyy-MM-dd'T'HH-mm-ss}"))
.to("direct:download");
from("direct:download")
.loopDoWhile(body().isNotNull())
.pollEnrich()
.simple("sftp://{{remote.user}}@{{remote.url}}/{{remote.directory}}?password={{remote.password}}"
+ "&move=.done/${property.StartDate}"
+ "&localWorkDirectory=work/tmp"
+ "&autoCreate=false"
+ "&consumer.bridgeErrorHandler=true"
+ "&throwExceptionOnConnectFailed=true"
+ "&recursive=true"
)
.timeout(0)
.choice()
.when(body().isNotNull())
.to("file:work/inbox/?fileName=${file:name}")
.otherwise()
.end()
.end();
我希望这会对某人有所帮助。
答案 1 :(得分:1)
pollEnrich始终适用于单个文件。这背后的意图是从端点(A)获取内容,然后从poller enrich(B)获取内容,然后我们聚合这两个内容并将其写入其他端点。
在你的情况下,A将来自(“activemq:queue:upload”)正文,而B将是(“file:basePath / $ {header.ID}?noop = true& recursive = true”)。如果它找到多个文件,它只选择一个文件,你可以玩聚合器并将其写入FTP。