Apache Camel pollEnrich没有复制所有文件

时间:2016-06-29 14:47:20

标签: java apache-camel jms activemq endpoint

我有一条骆驼路线,如下所示

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成功复制所有文件和文件夹?

2 个答案:

答案 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。